Using a Stack
Uses O(n) memory and time.
public class Solution { public String reverseWords(String s) { s = s.trim(); Stack<String> track = new Stack<String>(); String word = ""; int i=0; while (i < s.length()) { if (s.charAt(i) == ' ') { track.push(word); word = ""; while(i<s.length() && s.charAt(i) == ' ') i++; continue; } word +=s.charAt(i++); } if (word != "") { track.push(word); } s = ""; while(!track.isEmpty()) { s+= track.pop()+" "; } return s.trim(); } }
Efficient Solution
Memory O(1) and O(n) time.
public class Solution { public String reverseWords(String s) { s = s.trim(); StringBuffer ret = new StringBuffer(""); int start, end = s.length()-1; int i=s.length()-1; while(i >= 0) { if(s.charAt(i) == ' ') { start = i+1; while(start<=end) { ret.append(s.charAt(start++)); } ret.append(" "); while(i>0 && s.charAt(i) == ' ') { i--; } end = i; continue; } i--; } start = 0; while(start<=end) { ret.append(s.charAt(start++)); } return ret.toString(); } }
Using built-in java methods
public class Solution { public String reverseWords(String s) { s = s.trim(); String[] list = s.split(" "); s=""; for(String curr: list) { if(curr.trim().length()>0) s = (s == "" ? curr.trim() : curr.trim() + " " + s); } return s; } }