leetcode 151 reverse word in string
1、题目描述:
将字符串中的所有单词的位置反转。例如:
hello world ----> world hello
题目链接:https://leetcode.com/problems/reverse-words-in-a-string/description/
2、题目思路描述:
在这个题之前有一个较简单的题目344 reverse string,反转整个字符串。
这个题的思路其实很简单,我们可以反转整个字符串,在依次反转每个单词就可以达到这个将所有单词反转的目的。
但是这个题在leetcode上的通过率特别的低,我也是提交了很多次才ac的。
有几个小坑:
(1)反转后的字符串中每个单词之间只能有一个空格。
例如: a...b (.表示空格) -->a.b
(2)首部和尾部反转后的字符串中不能出现空格。
例如: ...a.b... --> a.b 所以我们要去掉多余的空格
3、题目代码描述:
GitHub源码地址:
https://github.com/distanceNing/leetcode/blob/master/string/151_reverse_word_in_str.cpp
以下为代码实现:
class Solution {
public:
//反转字符串某个区间内的字符
//也可用标准库里的reverse来代替此功能
void reverseString(string& s, int start, int end)
{
if ( end <= start )
return;
for (; start < end; start++, end--)
std::swap(s[start], s[end]);
}
void reverseWords(string& s)
{
if ( s == "" )
return;
//去除多余的空格
auto fin = std::unique(s.begin(), s.end(), [](char l, char r) {
return std::isspace(l) && std::isspace(r) && l == r;
});
s.erase(fin, s.end());
//去掉翻转前尾部的空格
if ( s.back() == ' ' && !s.empty())
s.pop_back();
//反转整个字符串
reverseString(s, 0, s.length() - 1);
//去掉反转后尾部的空格
if ( s.back() == ' ' && !s.empty())
s.pop_back();
int i = 0, start = 0;
//反转每个单词
for (; i < s.length(); ++i) {
if ( s[i] == ' ' ) {
reverseString(s, start, i - 1);
start = i + 1;
}
}
reverseString(s, start, i - 1);
}
};