思路:
使用辅助栈O(n)。
先去掉前后空格,对s进行substr操作(现在s首尾无多余空格),再在s两端补上一个空格(便于处理首尾字母的情况,这也是试出来的,并不是一开始就清晰的想到的。非要说的话,只能算积累一个思路,就是在字符串前后加上缓冲区应对越界的可能性)。之后fast,slow双指针,fast先++(此时fast指的一定是字母),一旦fast遇到下一个空格说明一个单词结束了,把单词加到栈里,再让fast一直走到下一个字母开始(中间有好多空格),并更新slow=fast-1(slow一直指向空格)。
之后出栈,字符串拼接即可。
class Solution {
public:
string reverseWords(string s) {
//去掉前后空格
int left=0,right=s.size()-1;
stack<string> stk;
while(s[left]==' '){
left++;
}
while(s[right]==' '){
right--;
}
s=s.substr(left,right-left+1);
//前后各加一个空格
s=' '+s;
s=s+' ';
int fast=0,slow=0;
while(fast<=s.size()-1)
{
fast++;//这时s[fast]一定不是空格
if(s[fast]==' ')
{
stk.push(s.substr(slow+1,fast-slow));
while(s[fast]==' '){
fast++;
}
slow=fast-1;//s[slow]一定是空格
}
}
string ans="";
while(!stk.empty())
{
ans+=stk.top();
stk.pop();
}
return ans.substr(0,ans.size()-1);
}
};