アイデア:
この質問では、以下の手順に従います。
- 文字列ssを逆の順序でトラバースし、単語ii、jjの左右の人差し指の境界を記録します。
- 単語の境界が決定されるたびに、単語リストresresに追加されます。
- 最後に、単語リストを文字列に連結して返します。
コード:
class Solution {
public:
string reverseWords(string s) {
string res;
if(s.size()==0 ) return s;
int right = s.size()-1;
int left = 0;
while(right>=0){
while(right>=0 && s[right]==' ') --right;
if(right<0) break;
left = right;
while(left>=0 && s[left]!=' ') --left;
res.append(s.substr(left+1,right-left));
res.append(" ");
right = left;
}
if(!res.empty()) res.pop_back();
return res;
}
};
//这种做法是我之前一直以为是对的方法,其实是不能AC的
//原因可看后面的图,但是是可以通过修改的,也就是加多一个字符串进行存即可,但是没上面那种方式好
class Solution {
public:
void reverse(string::iterator start,string::iterator end){
//if(start==NULL || end==NULL) return ;
if(start!=end){
while(start<end){
swap(*start,*end);
++start;--end;
}
}
return ;
}
string reverseWords(string s) {
if(s.size()==0 || s.size()==1) return s;
string::iterator p = s.begin();string::iterator q = s.begin();
int op = 0;
while( q!=s.end() ){
if((*q) == ' '){
++q;++p;
}else if( p==s.end() || (*p)==' ' ){
auto t1 = q;
auto t2 = p-1;
reverse(t1,t2);
q=(p);
}else{
++p;
}
}
reverse(s.begin(),s.end()-1);
return s;
}
};