Problem:
Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue
",
return "blue is sky the
".
- What constitutes a word?
A sequence of non-space characters constitutes a word. - Could the input string contain leading or trailing spaces?
Yes. However, your reversed string should not contain leading or trailing spaces. - How about multiple spaces between two words?
Reduce them to a single space in the reversed string.
Main Steps:
step 1 remove leading spaces and trailing spaces.
step 2 traverse the string from the end, for characters in between of the same two white spaces, append them to the same StringBuilder in order, then reverse the StringBuilder and concat it to the result, and do not forget to add a white space to separate each pair of adjacent words.
Note: In each while statement, start <= end should be in front of other conditions to avoid "StringIndexOutOfBoundsException: String index out of range: -1".
My solution:
public class Solution {
public String reverseWords(String s) {
String result = "";
if (s == null || s.length() == 0) {
return "";
}
int start = 0;
int end = s.length() - 1;
// remove leading spaces
while (start <= end && s.charAt(start) == ' ') {
start++;
}
// remove trailing spaces
while (start <= end && s.charAt(end) == ' ') {
end--;
}
if (start > end) {
return "";
}
while (start <= end) {
StringBuilder sb = new StringBuilder();
while (s.charAt(end) != ' ') {
sb.append(s.charAt(end));
end--;
}
result = result + sb.reverse().toString() + " ";
while (start <= end && s.charAt(end) == ' ') {
end--;
}
}
return result.substring(0,result.length() - 1);
}
}
Other solution copied from the website which is better:
using String[] and split(" ").
public class Solution {
public String reverseWords(String s) {
if (s == null || s.length() == 0) {
return "";
}
String[] array = s.split(" ");
StringBuilder sb = new StringBuilder();
for (int i = array.length - 1; i >= 0; --i) {
if (!array[i].equals("")) {
sb.append(array[i]).append(" ");
}
}
//remove the last " "
return sb.length() == 0 ? "" : sb.substring(0, sb.length() - 1);
}
}