151.翻转字符串里的单词
- 题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)
- 讲解链接:代码随想录 (programmercarl.com)
- 状态:直接看题解了。
思路与重点
- 可以用C++的stringstream对象来解决,
class Solution {
public:
string reverseWords(string s) {
istringstream iss(s);
string ans;
string word;
while (iss >> word) {
ans = word + " " + ans;
}
return ans.substr(0, ans.size() - 1);
}
};
- 考虑使用 O(1) 额外空间复杂度的原地解法。解题思路如下:1. 移除多余空格。2. 将整个字符串反转。3.将每个单词反转。
class Solution {
public:
void reverse(string& s, int start, int end){
//翻转,区间写法:左闭右闭 []
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
void removeExtraSpaces(string& s) {
//去除所有空格并在相邻单词之间添加空格, 快慢指针。
int slow = 0; //整体思想参考https://programmercarl.com/0027.移除元素.html
for (int i = 0; i < s.size(); ++i) {
//
if (s[i] != ' ') {
//遇到非空格就处理,即删除所有空格。
if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
while (i < s.size() && s[i] != ' ') {
//补上该单词,遇到空格说明单词结束。
s[slow++] = s[i++];
}
}