1. 程式人生 > 其它 >leetcode——反轉字串中的單詞

leetcode——反轉字串中的單詞

技術標籤:C++面試

題目:

給定一個字串,你需要反轉字串中每個單詞的字元順序,同時仍保留空格和單詞的初始順序。

示例:

輸入:"Let's take LeetCode contest"
輸出:"s'teL ekat edoCteeL tsetnoc"

提示:在字串中,每個單詞由單個空格分隔,並且字串中不會有任何額外的空格

方案一:原地解法,分組旋轉字串, 可以接受多個連續空格

class Solution {
private:
    void reverseString(string& s, int begin, int end) {
        for (int i = begin, j = end; i < j; i++, j--) {
            swap(s[i], s[j]);
        }
    }
public:
    string reverseWords(string s) {
        int begin = -1, len = s.size();
        for (int i = 0; i < len; i++){
            if (s[i] == ' ' &&  begin >= 0) {
                reverseString(s, begin, i - 1);
                begin = -1;
            } else if (s[i] != 0 && begin < 0){
                begin = i;
            }
        }
        if (begin >= 0) {
            reverseString(s, begin, len - 1);
        }
        return s;
    }
};

時間複雜度O(n)

空間複雜度O(1)

方案二:額外空間反轉

class Solution {
public:
    string reverseWords(string s) {
        int i = 0, len = s.size();
        string res;
        while(i < len) {
            int start = i;
            while(i < len && s[i] != ' ') {
                i++;
                continue;
            }
            int end = i - 1;
            while(start <= end) {
                res.push_back(s[end--]);
            }
            while(i < len && s[i] == ' ') {
                res.push_back(s[i]);
                i++;
                continue;
            }
        }
        
        return res;
    }
};

時間複雜度O(n)

空間複雜度O(n)