原题链接:https://oj.leetcode.com/problems/reverse-words-in-a-string/
题目大意:以单词为单位翻转整个字符串,如“I am a coder",翻转后为"coder a am I”
阶梯方法:两次reverse
思路:进行2次reverse,第一次翻转整个字符串,第二次翻转单个单词。如“I am a coder",第一次翻转后为”redoc a ma I",第二次翻转为“coder a am I"。需要考虑的边界条件为,首尾出线空格,以及单词间有连续多个空格。
时间复杂度:O(N) 空间复杂度: constant space
class Solution {
public:
void reverseWords(string &s)
{
if(s.empty())
return ;
reverse(s,0,s.length()-1);
int start=0;
for(int i=0;i<s.length();i++)
{
if(s[i]==' ')
{
reverse(s,start,i-1);
start=i+1;
}
}
reverse(s,start,s.length()-1);
//下面处理连续空格或者首尾空格
while(!s.empty()&&s[0]==' ')
{
s.erase(0,1);
}
while(!s.empty()&&s[s.length()-1]==' ')
{
s.erase(s.length()-1,1);
}
//处理两个字符中间多个空格的情形,经过上面处理若s不为空,则首尾必不为空格
if(!s.empty())
{
for(int i=0;i<s.length()-1;)
{
while(s[i]==' '&&s[i+1]==' ')
s.erase(i+1,1);
i++;
}
}
}
void reverse(string &s,int start,int end)
{
if(start<end)
{
char temp;
int i, j;
for(i=start,j=end;i<j;i++,j--)
{
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
}
};