557反转字符串3
这题和上一题也一样,只要判断好left和right就可以了
时间复杂度O(N),空间复杂度O(1)
class Solution {
public:
string reverseWords(string s) {
for(int left = 0; left < s.length();){
while(s[left] == ' ') left ++;
int right;
for(right = left + 1; right < s.length(); right++){
if(s[right] == ' '&& s[right - 1] != ' '){
reverse(s.begin() + left, s.begin() + right);
left = right + 1;
break;
}
else if (right == s.length() - 1){
reverse(s.begin() + left, s.begin() + right + 1);
return s;
}
}
left = right + 1;
}
return s;
}
};
151翻转字符串里的单词
用python的内置函数真的很快,但是时间复杂度是O(N),空间复杂度也是O(N),因为要用另一个数组空间来存放结果
class Solution:
def reverseWords(self, s: str) -> str:
return " ".join(reversed(s.split()))
但是题目显然是有更好的空间复杂度为O(1)的解法的,于是又去看了题解…
主要分为4个部分
- 先将整个字符串翻转
- 遍历数组,查找单词的首尾,过程中一边去掉多余的空格,进行赋值左移
- 然后单词翻转
- 最后去掉末尾的空格
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(), s.end());
int ind = 0;
for(int left = 0; left < s.length(); left++){
if(s[left] != ' '){
if(ind != 0) s[ind++] = ' ';//除了第一个单词,其他的单词开头之前都要填一个空格
int right = left;
while(right < s.length() && s[right] != ' ') s[ind++] = s[right++];
reverse(s.begin() + ind - (right - left), s.begin() + ind);
left = right;
}
}
s.erase(s.begin() + ind, s.end());
return s;
}
};
时间复杂度O(N),空间复杂度O(1)