Leetcode 151.翻转字符串里的单词
Posted bulangman277
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 151.翻转字符串里的单词相关的知识,希望对你有一定的参考价值。
题目描述
思路
首先读题干,发现初始字符串时以一个或多个空格将单词分隔开而组成的。
所以想到第一个问题,如何把字符串中的多个空格减少为一个空格,即每个单词间只存在一个空格。
然后继续看题干,返现需要以单词为单位,将整个字符串翻转。
所以想到第二个问题,如何以单词为单位将字符串翻转。
- 首先回答第一个问题:
要想将空格减少,可以采用快慢指针法。
int slow=0,fast=0;
字符串中的空格分为三类:头部空格,内部空格,尾部空格。
对于头部空格:
//首先去除字符串首部的空格
while(s.size()>0&&fast<s.size()&&s[fast]==' ')
fast++;
对于内部空格:
//然后去除字符串中部的空格
for(;fast<s.size();fast++)
if(s[fast]==' '&&s[fast]==s[fast-1]&&fast-1>0)
continue;
else
s[slow]=s[fast];
slow++;
对于尾部空格:
//然后去除字符串末尾的空格
if(s[slow-1]==' '&&slow-1>0)
s.resize(slow-1);
else
s.resize(slow);
- 然后回答第二个问题
可以先调用reverse()
函数将整个字符串翻转,然后再以空格为界限,分割每个单词,对于每个单词,调用reverse()
函数。这样就将整个字符串翻转,且同时也将单词翻转了。
代码实现
class Solution
public:
void reverse(string &s,int start,int end)
for(int i=start,j=end;i<j;i++,j--)
swap(s[i],s[j]);
void removespace(string &s)
int slow=0,fast=0;
//首先去除字符串首部的空格
while(s.size()>0&&fast<s.size()&&s[fast]==' ')
fast++;
//然后去除字符串中部的空格
for(;fast<s.size();fast++)
if(s[fast]==' '&&s[fast]==s[fast-1]&&fast-1>0)
continue;
else
s[slow]=s[fast];
slow++;
//然后去除字符串末尾的空格
if(s[slow-1]==' '&&slow-1>0)
s.resize(slow-1);
else
s.resize(slow);
string reverseWords(string s)
cout<<s.size()<<endl;
//首先去除多余的空格
removespace(s);
cout<<s.size()<<endl;
//然后反转整个字符串
reverse(s,0,s.size()-1);
cout<<s.size()<<endl;
//然后单独反转每个单词
int left=0;
for(int i=0;i<s.size();i++)
if(s[i]==' ')
reverse(s,left,i-1);
left=i+1;
if(s[i]!=' '&&(i+1)==s.size())
reverse(s,left,i);
return s;
;
以上是关于Leetcode 151.翻转字符串里的单词的主要内容,如果未能解决你的问题,请参考以下文章