我这里分为3个步骤:
- 去除多余空格
- 翻转字符串
- 使用指针截出每一个单词的长度,在翻转回来
class Solution { public: void reverse(string&s,int start,int end) { for(int i=start,j=end;i<j;++i,--j) swap(s[i],s[j]); } //去除空格,用双指针 void removespace(string&s) { int fastindex=0,slowindex=0; //去除前导空格 while(s.size()>0&&fastindex<s.size()&&s[fastindex]==' ') { ++fastindex; } //去除中间空格 for(;fastindex<s.size();++fastindex) { if(fastindex-1>0&&s[fastindex-1]==s[fastindex]&&s[fastindex]==' ') { continue; } else{ s[slowindex++]=s[fastindex]; } } //去除尾随空格 if(slowindex-1>0&&s[slowindex-1]==' ') { s.resize(slowindex-1); } else{ s.resize(slowindex); } } string reverseWords(string s) { //去掉空格 removespace(s); //单词区间 int begin=0,end=0; bool flag=false; //翻转字符串 reverse(s,0,s.size()-1); for(int i=0;i<s.size();++i) { //确定单词开头元素 if(!flag) { begin=i; flag=true; } //确定单词最后一个元素的位置 if(flag&&s[i]==' '&&s[i-1]!=' ') { end=i-1; flag=false; reverse(s,begin,end); } //处理最后一个单词没有空格 if(flag&&(i==(s.size()-1))&&s[i]!=' ') { end=i; flag=false; reverse(s,begin,end); } } return s; } };