根据题意,分为三步解决问题;
思路:
1.去掉前后中间多余空格
2.翻转字符串
3.翻转单词
注意事项:
这里string里的erase方法是O(n)时间复杂度,遍历里面再使用erase,复杂度就是O(n^2)。所以自己实现去除空格的方法.
代码实现:
1.去除空格:
void era(string& s)
{//快慢指针去除连续空格和前后空格
int slowindex=0;int fastindex=0;
//去除前面
while(s.size()>0&&s[fastindex]==' '&&fastindex<s.size())
{
fastindex++;
}//这样就不会复制空格
//去除中间连续
for(;fastindex<s.size();++fastindex)
{
if(s[fastindex]==' '&&s[fastindex]==s[fastindex-1])
{
continue;
}//跳过所有空格
else{
s[slowindex++]=s[fastindex];
}//非空格赋值
}
//注意这里slowindex最后+1了
//去除后面
if(s[slowindex-1]==' '&&slowindex - 1 >0)
{
s.resize(slowindex-1);
}
else
{
s.resize(slowindex);
}
}
精简版:参考题目27.移除元素
void era(string& s)
{
int slow=0;
for(int i=0;i<s.size();++i)
{//跳过所有空格
if(s[i]!=' ')
{
if(slow!=0)s[slow++]=' ';//加上空格
while(s[i]!=' '&&i<s.size()) s[slow++]=s[i++];//单词
}
}
s.resize(slow);
}
2.反转字符串。
直接用reverse或者双指针自己实现。
3.翻转单词。
int k=0;
for(int i=0;i<s.size();)
{
//末尾单词翻转
if(i+1==s.size())reverse(s.begin()+k,s.end());
if(s[i]!=' ')i++;
else if(s[i]==' ')
{//中间单词翻转
reverse(s.begin()+k,s.begin()+i);
i+=1;
k=i;
}
}
精简版:
int start = 0;
//保证第一个单词的开始下标一定是0。
for (int i = 0; i <= s.size(); ++i)
{
if (i == s.size() || s[i] == ' ')
{ //到达空格或者串尾,说明一个单词结束。进行翻转。
reverse(s.begin()+start,s.begin()+ i);
start = i + 1; //更新下一个单词的开始下标start
}
}