题目:
给定一个字符串,逐个翻转字符串中的每个单词。
说明:
无空格字符构成一个 单词 。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
class Solution {
public:
// 1、移除冗余空格
void removeExtraSpaces(string& s)
{
int slow = 0, fast = 0;
// 1.1 去掉前面的空格
while (s.size() > 0 && s[fast] = = ' ' && fast < s.size())
{
fast++;
// 出错1:::::这里多写了一句 slow++
// slow一定得是第一个字符开始,所以这里做 ++ 肯定是错误的
}
// 1.2 去掉中间的空格
for (; fast < s.size(); fast++)
{
if (fast > 1 && s[fast] = = s[fast - 1] && s[fast] = = ' ')
{
continue;
}
else
{
s[slow] = s[fast]; // 注意最后尾部的处理,当执行完最后一个字符时,slow会再次+1
slow++; // 这里忘记 ++
}
}
// 1.3 去掉尾部的空格
// 感觉经过 1.2 之后,尾部要么就是1个空格,要么就是0个空格
// 实践后,尾部要么两个空格,要么一个空格,要么没有空格,
// 且经过1.2之后应该是有两个空格也就是
// 出错二::::::if 语句不对
// 这里slow是遍历之后自动 +1,所以 +1 后的值不一定有效,所以判断s[slow]是错误的
// if (s[slow] = = ' ' && s[slow]= =s[slow-1])
if (s[slow-1] == ' ' && slow > 1)
{
s.resize(slow-1);
}
else
{
s.resize(slow);
}
}
// 2、反转字符串
void reverse(string& s, int start, int end)
{
for (int i = start, j = end; i < j; i++, j--)
{
swap(s[i], s[j]);
}
}
string reverseWords(string s)
{
// 写两个补充函数:1、移除冗余空格 2、反转字符串
// 第一步:移除冗余空格
removeExtraSpaces(s);
// 第二步:将整个字符串反转
reverse(s, 0, s.size()-1);
// 第三步:将每个单词进行反转
int slow = 0;
for (int fast = 0; fast < s.size(); fast++)
{
if (s[fast] == ' ')
{
reverse(s, slow, fast - 1);
slow = fast + 1;
}
if(fast==s.size()-1)
{
reverse(s, slow, fast);
}
}
return s;
}
};