一、 题目
给出一个字符串,以单词为单位反转字符串。
例如 i am echo
返回 echo am i
二、 分析
仔细分析会发现,对于中间结果我们需要保存,即我们得保证以单词为单位。另外我们需要考虑到下面的情况
1、中间有多个空格的处理
2、没有空格的字符串
3、反转后开头和结尾不能有空格
4、最后的结果单词间得有空格
所以,由以上我们有两种思路,一种就是以单词为单位反转,这个需要用到vector,reverse即可,需要两次for循环,如下:
class Solution {
public:
void reverseWords(string &s) {
vector<string> des;
if(s.empty())
return;
int len = s.size();
for(int i = 0; i < len; i++){
if(s[i] == ' ')
continue;
string word;
while(i < len && s[i] != ' '){
word += s[i];
i++;
}
des.push_back(word);
}
reverse(des.begin(), des.end());
if(des.empty())
s = "";
else {
s.clear();
int j ;
for(j = 0; j < des.size() -1; j++){
s += des[j];
s += ' ';
}
s += des[j];
}
}
};
另一种思路是使用特殊的存储结构——栈,那么此时我们就不需要再反转了,直接顺序保存即可,代码如下:
class Solution {
public:
void reverseWords(string &s) {
stack<string> des;
if(s.empty())
return;
int len = s.size();
for(int i = 0; i < len; i++){
if(s[i] == ' ')
continue;
string word;
while(i < len && s[i] != ' '){
word += s[i];
i++;
}
des.push(word);
}
if(des.empty())
s = "";
else {
s.clear();
int j ;
int length = des.size();
for(j = 0; j < length -1; j++){
s += des.top();
des.pop();
s += ' ';
}
s += des.top();
}
}
};