OJ链接:翻转单词顺序列
题目描述
- 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
解题思路
- 是一个字符串逆置的问题,我们这里要考虑自己划分子串的问题。
- 例如:“student. a am I”->局部单词逆置“.tneduts a ma I”->整体逆置“I am a students.”
代码
class Solution {
public:
void Reverse(string& str,int start,int end)
{
while(start<end)
{
char temp=str[start];
str[start]=str[end];
str[end]=temp;
start++;
end--;
}
}
string ReverseSentence(string str) {
先局部逆置,在整体逆置
if(str.size()==0)
return str;
int i=0;
int j=i;
int len=str.size();
while(i<len)
{
while(i<len && !isspace(str[i]))
i++;
//让i一直往后走,碰到第一个空格
Reverse(str,j,i-1);
//逆置当前有效子串,我们采用闭区间
while(i<len && isspace(str[i]))
i++;
//过滤所有空格,指向下一个有效子 串的开始
j=i; //保存起始位置
}
//走到这里,一定是 i == str.size()了,但是后一个有效子串并没有被逆置,则逆置
Reverse(str,j,i-1);
Reverse(str,0,i-1);
//最后在整体逆置
return str;
}
};