思路
代码
Method 1,Me
cpp
class Solution {
public:
string reverseWords(string s) {
int i, start;
// Step 1
for(i = 0; i < s.size() - 1; i++)
{
if(s[i] == ' ' && s[i + 1] == ' ')
{
s.erase(i + 1, 1);
i--;
}
}
// Step 2
if(!s.empty() && s[0] == ' ')
{
s.erase(s.begin());
}
if(!s.empty() && s[s.size() - 1] == ' ')
{
s.erase(s.end() - 1);
}
// Step 3
reverse(s.begin(), s.end());
// Step 4
start = 0;
for(i = 0; i <= s.size(); i++)
{
if(i == s.size() || s[i] == ' ')
{
reverse(s.begin() + start, s.begin() + i);
start = i + 1;
}
}
return s;
}
};
注意去除头部和尾部空格的代码要放在去除重复空格的后面;
Method 2 : 双指针法
cpp
void removeExtraSpaces(string& s)
{
int slowIndex = 0, fastIndex = 0; // 定义快指针,慢指针
// 去掉字符串前面的空格
while (s.size() > 0 && fastIndex < s.size() && s[fastIndex] == ' ')
{
fastIndex++;
}
for (; fastIndex < s.size(); fastIndex++)
{
// 去掉字符串中间部分的冗余空格
if (fastIndex - 1 > 0
&& s[fastIndex - 1] == s[fastIndex]
&& s[fastIndex] == ' ')
{
continue;
}
else
{
s[slowIndex++] = s[fastIndex];
}
}
if (slowIndex - 1 > 0 && s[slowIndex - 1] == ' ')
{ // 去掉字符串末尾的空格
s.resize(slowIndex - 1);
}
else
{
s.resize(slowIndex); // 重新设置字符串大小
}
}
去除多余空格时间复杂度:O(n);
注释
Me :自己写的