要求:in-place,extra space o(1)
【我的想法是】
1.先将收尾多余的空格去掉;
2. 遍历一次字符串,我要做两件事:
a)每识别出一个单词,就把这个单词reverse. 比如:我识别出apple,就reverse成elppa;
b)去掉两个单词之间的多余空格:如果识别出空格,就把该空格后面多余的空格删掉
3. 将整个字符串reverse一下。
举例说来:s=" You are the apple of my eye "
第二步做完是:s=“uoY era eht elppa fo ym eye”
第三步: s=“eye my of apple the are You”
class Solution {
public:
void reverseWords(string &s) {
int i=0,j,k;
while(i<s.size()){ // move leading spaces
if(s[i]==' ')
s.erase(s.begin()+i);
else break;
}
i=s.size()-1; // move trailing spaces
while(i>=0){
if(s[i]==' '){
s.erase(s.begin()+i);
i--;
}
else break;
}
i=0;
while(i<s.size()){ //reverse each word and remove extra spaces between two words;
if(s[i]!=' '){
int start=i;
while(i<s.size()&&s[i]!=' ')
i++;
int end=i-1;
for(j=start,k=end;j<=k;j++,k--)
swap(s[j],s[k]);
}
else{
while(i+1<s.size()&&s[i+1]==' ')
s.erase(s.begin()+(i+1));
i++;
}
}
for(i=0,j=s.size()-1;i<=j;i++,j--) //reverse the whole string
swap(s[i],s[j]);
}
};
【运用已有的数据类型stringstream】
在discuss上看到的。用了stringstream,那么去空格,split各个单词都已经信手拈来,不必自己写。而且,思路很简洁易懂,就是把每个单词识别出来,insert到新生成的string中。不过呢,这算不算in-place?
总之,这种想法清晰简单。我蛮喜欢的。
void reverseWords(string &s){
stringstream ss(s);
string word="",out="";
while(ss>>word){
out=word+" "+out;
}
s=out.substr(0,out.length()-1); //减1的原因:out结尾多了一个空格
}