题目
Given an input string, reverse the string word by word.
For example,
Given s = “the sky is blue”,
return “blue is sky the”.
思路
整体思路,反转每个词,再反转整个句子。
方法1:考虑到给定s中会有一些多余空格,即开头和结尾的空格以及中间多个连续空格,第一步就是去除这些多余空格,确保词与词之间只有一个空格;第二步将每个词倒转,最后再将整个句子倒转。这里采用数组实现。
方法2(推荐!): 利用两个stack,一个表示单词,一个表示句子。当遇到非空格字符时放入单词stack;当遇到空格时将单词stack中的字符压入句子stack中(注意:单词此时已经逆序一次),然后仅添加一个空格。最后将句子stack依次输出,此时句子逆序。这里利用了stack”先进后出”的特性。
代码
方法1:
public class Solution {
public static String reserveWord(String s) {
char[] chars = removeDuplicateSpace(s);
int begin = 0;
int end = 0;
for (; end < chars.length; end++) {
if (chars[end] == ' ') {
swap(chars, begin, end - 1);
begin = end + 1;
end = begin;
}
}
swap(chars,begin,end-1);
swap(chars,0,chars.length-1);
return new String(chars);
}
private static void swap(char[] chars, int begin, int end) {
char temp;
while (begin < end) {
temp = chars[begin];
chars[begin] = chars[end];
chars[end] = temp;
begin++;
end--;
}
}
private static char[] removeDuplicateSpace(String s) {
//一个或多个空格 正则
String regex = "\\s+";
String resultStr = s.trim().replaceAll(regex," ");
System.out.println(resultStr);
return resultStr.toCharArray();
}
}
方法2:
public class Solution {
public static String reserveWord(String s) {
Stack<Character> wordStack = new Stack();
Stack<Character> sentenceStack = new Stack();
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i) == ' '&wordStack.size() > 0) {
transfer(wordStack,sentenceStack);
continue;
}
if(s.charAt(i) != ' ') {
wordStack.push(s.charAt(i));
}
}
StringBuilder sb = new StringBuilder();
while(sentenceStack.size() > 0){
sb.append(sentenceStack.pop());
}
return sb.toString();
}
private static void transfer(Stack<Character> wordStack, Stack<Character> sentenceStack) {
sentenceStack.push(' ');
while (wordStack.size() > 0) {
sentenceStack.push(wordStack.pop());
}
}
}