leetcode

151.反转字符串中的单词

力扣链接

class Solution {
public:
    // 移除多余的空格,参照数组中移除元素,不要用erase本身O(n)时间复杂度外加for循环O(n^2)
    void remove_extra_spaces(std::string& s){
        int slow = 0, fast = 0;
        for(;fast<s.size();fast++){
            if (s[fast]!=' '){ // 遇到非空格才处理,删除所有空格
                if (slow!=0) s[slow++] = ' '; //除了开头,非空格字符前添加空格
                while(fast<s.size() && s[fast]!=' ') s[slow++] =s[fast++];// 添加非空格字符
            }
        }
        s.resize(slow);// for循环最后slow++,slow就是新字符串长度
    }

    std::string reverseWords(std::string s) {
        remove_extra_spaces(s);
        std::reverse(s.begin(), s.end());
        int start = 0;// 移动指向每个单词的首字符
        for (int i=0; i<=s.size();i++){
            if (i==s.size() || s[i]==' '){
                // 迭代器右边界指向字符串最后字符的后一位 是s.begin()+i而不是s.begin()+i-1
                std::reverse(s.begin()+start, s.begin()+i); // i指向每个单词后的空格
                start = i+1;// 指向空格后下个单词的首字符
            }
        }
        return s;
    }
};