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
".
解题思路:
两次翻转,先整个字符串翻转,然后按字翻转。
如"hello world",第一次翻转"dlrow olleh",第二次翻转"world hello"
注意:
1. 去除收尾多余的空格
2. 去除字间多余的空格
3. 标点符号不做特殊处理,也一起翻转
4. 我没有考虑只有一个字的情况(也做了两次翻转),可以在最开始扫描一遍,判断是否只有一个字,若只有一个字,直接返回
5. 一些特殊的测试用例
" "; "hi!", " a b ";
源码:
class Solution {
public:
void reWord(string &s, int start, int end)
{
while (start < end)
{
swap(s[start], s[end]);
start++;
end--;
}
return;
}
void reverseWords(string &s) {
// 两次翻转
// 先整个字符串翻转,然后按字翻转
if (0 == s.size())
return;
int i = 0;
while (s[i] == ' ') // 跳过开始的空格
i++;
s.erase(0, i);
i = s.size() - 1;
while (s[i] == ' ') // 跳过结尾的空格
i--;
s.erase(i+1, s.size() - i - 1);
if (0 == s.size()) // 全空格的情况
return;
reWord(s, 0, s.size() - 1); // 第一次翻转
int wstart = 0;
int wend = 0;
int len = s.size(); // 中间删除,size会改变
for (int i = 0; i < len; ++i)
{
if (s[i] == ' ') // 一个字结束
{
reWord(s, wstart, i - 1);
int j = i;
while (s[++j] == ' ') ;
s.erase(i+1, j - i -1); // 删掉多余的空格
wstart = ++i; // 更新下一个字的开始
}
}
reWord(s, wstart, s.size() - 1); // 翻转最后一个字!!!
return;
}
};