这道题非常常见,在primer上甚至有现成的详细代码。主要的思路很简单,先把整个串翻转一下,然后再对每个单词翻转,这样就可以了。
复杂倒不是在这个思路上,而是题目给出的一些限制,比如,输入全空格时,不能返回全空格,而是应该返回“NULL”,还有就是输入的开始和结束都可能有多余的空格,但是输出中这些空格应当删掉,此外,单词之间也可能有多个空格,最后的结果要求只能有一个空格。
在剑指offer上看到这个题时,我的做法是直接翻转,然后找到第一组非空格的单词,直接翻转,这样的做法不能很好的处理上面的要求,因为多余的空格还是多余的显示了。
后来想了一下,想到了stringstream,这个东西是我看了primer之后才知道的,很好用,不过可能用的人并不多。它的用法跟标准输入输出其实没什么区别,用某个string初始化之后,就可以解析这个string了,这样每次读入一个word,然后翻转这个word,并把word之间用一个空格连接起来,解决了这个问题。
下面是我ac的代码,因为只有二十多组测试用例,不能保证完全正确。
class Solution {
public:
void swap(char &a, char &b){
char t = a;
a = b;
b = t;
}
void do_Reverse(string &s, int a, int b){
for(int i=a,j=b;i<j;i++,j--){
swap(s[i],s[j]);
}
}
void reverseWords(string &s) {
do_Reverse(s, 0, s.length()-1);
istringstream stream(s);
string word, res = "";
stream>>word;
do_Reverse(word, 0, word.length()-1);
if(word != ""){
res += word;
}
while(stream>>word){
do_Reverse(word, 0, word.length()-1);
res += " "+word;
}
s = res;
}
};