双指针
重点:先反转再逐个单词调整
class Solution {
public:
string reverseWords(string s) {
if(s.empty())return s;
int n=s.size();
while(s[n-1]==' '){
s.erase(n-1,1);
n--;
if(n<1)return s;
}
// cout<<s<<";1"<<endl;
reverse(s.begin(),s.end());
while(s[n-1]==' '){
s.erase(n-1,1);
n--;
if(n<1)return s;
}
// cout<<s<<";2"<<endl;
s=s+' ';
n++;
// cout<<s<<";3"<<endl;
int slow=0,fast=0;
while(fast<n){
if(s[slow]!=' '&&s[fast]==' '){
int temp=fast+1;
fast--;
while(slow<fast){
char c=s[slow];
s[slow]=s[fast];
s[fast]=c;
slow++;
fast--;
}
slow=temp;
fast=slow;
}else if(s[slow]!=' '&&s[fast]!=' ')fast++;
else{
n--;
s.erase(slow,1);
}
}
// cout<<s<<";4"<<endl;
s.erase(n-1,1);
return s;
}
};
双指针
重点:对源字符串从右向左逐个单词移到新字符串out中
class Solution {
public:
string reverseWords(string s) {
if(s.empty())return s;
string out;
int n=s.size();
int slow=n-1,fast=n-1;
while(slow>=0&&fast>=0){
if(s[slow]==' '){
fast--;
slow=fast;
}else if(s[slow]!=' '&&s[fast]==' '){
out=out+s.substr(fast+1,slow-fast)+' ';
fast--;
slow=fast;
}else{
fast--;
}
}
if(slow>=0){
out=out+s.substr(fast+1,slow-fast);
}
if(out.empty())return out;
int nn=out.size();
if(out[nn-1]==' '){
out.erase(nn-1,1);
}
return out;
}
};