思路
首先整体翻转一遍,然后利用双指针找单词,把单词往前移,一直覆盖,就像27. 移除元素 一样。
解题方法
先整体翻转。
遍历数组,判断当前元素是不是空格,如不是(if (idx != 0) 等会说):
那就是当前元素是单词了,往前覆盖,一直到当前元素是空格,此时idx指向单词的下一个位置,因为while里最后一次给++了,此时翻转这个单词,由于翻转是左闭右开,所以reverse(s.begin() + idx - count, s.begin() + idx);正好可以翻转整个单词(count计数器计算这个单词长度)。
接下来说一下if (idx != 0) :
当前元素不是空格时,idx此时还指着上一个单词的下一个位置,又因为让单词和单词之间有一个空格,所以咱s[idx++] = ' ';又第一个位置不能有空格,所以咱判断 if (idx != 0) ,当idx离开初始位置的时候idx肯定不等于0了。
复杂度
时间复杂度:
计算:O(n+m),其中m为单词长度和,且m<n。
所以 O(n+m)应该<O(n+n)=O(n)
空间复杂度:
O(1)
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(), s.end());
int idx = 0;
int count = 0;
for (int i = 0; i < s.size(); ++i) {
count = 0;
if (s[i] != ' ')
{
if (idx != 0)
{
s[idx] = ' ';
idx++;
}
while (i < s.size() && s[i] != ' ')
{
s[idx] = s[i];
idx++, i++;
count++;
}
reverse(s.begin() + idx - count, s.begin() + idx);
}
}
s.erase(s.begin() + idx, s.end());
return s;
}
};