LeetCode 151 Reverse Words in a String

182 阅读1分钟

LeetCode 151 Reverse Words in a String

思路

  1. 多余的空格去掉,包括头尾的空格,单词之间多余的空格

  2. 将每个单词在原地翻转

  3. 将整个句子翻转

第一份代码是将各步骤分开写,第二份代码将各步骤合在一起。

代码

class Solution {
public:
    string reverseWords(string s) {
        // 去掉多余的空格
        int slow = 0, fast = 0;
        
        while (fast < s.size()) {
            while (fast < s.size() && s[fast] == ' ') ++fast;
            
            // 这里不能拆开写成2个if,slow > 0是为了保证第一个单词前不会有空格
            if (fast < s.size() && slow > 0) s[slow++] = ' ';
            
            while (fast < s.size() && s[fast] != ' ')
                s[slow++] = s[fast++];
        }
        
        s.resize(slow);
        
        slow = 0, fast = 0;
        
        while (fast < s.size()) {
            while (fast < s.size() && s[fast] != ' ') ++fast;
            reverse(s.begin() + slow, s.begin() + fast);
            ++fast;
            slow = fast;
        }
        
        reverse(s.begin(), s.end());
        return s;
    }
};

class Solution {
public:
    string reverseWords(string s) {
        int slow = 0, fast = 0, start = 0;
        
        while (fast < s.size()) {
            while (fast < s.size() && s[fast] == ' ') ++fast;
            if (fast < s.size() && slow > 0) s[slow++] = ' ';
            
            start = slow;
            
            while (fast < s.size() && s[fast] != ' ')
                s[slow++] = s[fast++];
            
            reverse(s.begin() + start, s.begin() + slow);
        }
        
        s.resize(slow);
        
        reverse(s.begin(), s.end());
        return s;
    }
};