您的位置:首页 > 其它

Reverse Words in a String

2014-09-11 14:38 162 查看

Reverse Words in a String

Given an input string, reverse the string word by word.

For example,

Given s = "
the sky is blue
",

return "
blue is sky the
".

click to show clarification.
Clarification:
What constitutes a word?

A sequence of non-space characters constitutes a word.
Could the input string contain leading or trailing spaces?

Yes. However, your reversed string should not contain leading or trailing spaces.
How about multiple spaces between two words?

Reduce them to a single space in the reversed string.

题目:反转句子中的单词。
分析:两次反转。先将整个句子反转,然后每个单词反转。本来思想比较简单直接,扫描两遍即可O(N)。空格的处理坑死人。 注意处理句子两头的空格,单词间隔中间多个空格的压缩成一个空格。

代码:

class Solution {
public:
void reverseWords(string &s) {//基本思想,两次反转
if(s.length()<1) return ;
//1.第一次反转
reverse(s.begin(),s.end());
int len=s.length();

//去空格
int i=0;
while(i<len && s[i]==' ') i++;
if(i>=len) {s=""; return;}
s.erase(0,i);
len=len-i;//erase后串长度变化,要更新串长
int k=-1; //k i两个指针一前一后,去掉单词中间多余的空格
for(i=0;i<len;i++){
if(s[i]!=' '){
k++; s[k]=s[i];
}else if((i<len-1) && s[i]==' ' && s[i+1]==' '){
continue;
}else{// if(s[i]==' ' && s[i+1]!=' ')
if(i==len-1){//最后一个是字符
if(s[i]!=' ') {
k++; s[k]=s[i];
}
break;
}
k++;
s[k]=s[i];
}
}
//删除末尾多余的空间
k++;
s.erase(k);

 i=0;
len=k;//更新串长度

int j=i;
for(;i<len;i++){
if(s[i]==' '){
reverse(s.begin()+j,s.begin()+i);
j=i;
while(i<len && s[i]==' '){
i++; j++;
}
}
}//for
if(i>=len && j<len){
reverse(s.begin()+j,s.begin()+i);//最后一个单词无法用空格判断
}

return ;
}
};

方法二:
声明一个变量,来存储反转后的结果,然后赋值给s。从后往前扫描,遇到单词,反转。

class Solution {
public:
void reverseWords(string &s) {
string rs;
for (int i = s.length()-1; i >= 0; )
{
while (i >= 0 && s[i] == ' ') i--;
if (i < 0) break;
if (!rs.empty()) rs.push_back(' ');
string t; //存储单个单词
while (i >= 0 && s[i] != ' ') t.push_back(s[i--]);
reverse(t.begin(), t.end());//单词反转
rs.append(t); //放入结果中
}
s = rs;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: