Idea: Para
esta pregunta, seguimos los pasos a continuación:
- Atraviese la cadena ss en orden inverso, registre los límites de índice izquierdo y derecho de la palabra ii, jj;
- Cada vez que se determina el límite de una palabra, se agrega a la lista de palabras resres;
- Finalmente, concatene la lista de palabras en una cadena y devuélvala.
Código:
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;
}
};