原地翻转,空间o(1)
先将单词移动到最前面, 再局部翻转单词,最后整体翻转
class Solution {
public:
string reverseWords(string s) {
int i = 0, index = 0, size = s.size();
while(i < size)
{
if(s[i] != ' ')
{
if(index != 0) s[index++] = ' '; //注意:除了第一个单词,需要先加入空格
int start = index;
while(i < size && s[i] != ' ')
s[index++] = s[i++]; //将下一个不是空格的元素移动到它应该在的位置
reverse(s.begin() + start, s.begin() + index); //局部翻转
}
++i;
}
s.erase(s.begin() + index, s.end()); //注意:删除多余元素
reverse(s.begin(), s.end()); //整体翻转
return s;
}
};
简单思路,空间o(n)
class Solution {
public:
string reverseWords(string s) {
string res;
int i = s.size() - 1;
while(i >= 0)
{
int len = 0;
while(i >=0 && s[i] == ' ') --i; //注意i >= 0
while(i >=0 && s[i] != ' ')
{
++len;
--i;
}
if(len > 0) res += s.substr(i + 1, len) + ' '; //注意len>0
}
res.erase(res.end()-1);
return res;
}
};