1. 程式人生 > 實用技巧 >LeetCode151. 翻轉字串裡的單詞

LeetCode151. 翻轉字串裡的單詞

題意是要把原字串中所有的單詞劃分出來,倒序用一個空格的間隙來連線字串,我們只需要劃分出所有的單詞,然後把它們連線起來,每兩個單詞之間放一個空格就好了。

分割空格之間的單詞,很容易想到用雙指標進行分割,只需要找到每個單詞的第一個字母(也就是第一個不為空格的字母),然後左指標指向這個單詞,右指標不斷右移直到碰到指向一個空格或者字串的末尾。

我們額外開一個字串陣列words存放所有劃分出來的單詞,把每一個劃分出來的單詞都存在這個數組裡,分割出所有的單詞之後,翻轉一下這個陣列,然後把所有單詞連線起來(每兩個單詞之間用一個空格分割),就OK啦。

程式碼如下:

class Solution {
public:
    string reverseWords(string s) {
        if(s.size() == 0) {
            return "";
        }
        vector<string> words;                              //存放所有劃分出來的單詞
        for(int i = 0; i < s.size(); ++i) {
            while(s[i] == ' ' && i < s.size()) {           //尋找每個字串的第一個字母(第一個不為空格的字元)
                ++i;
            }
            if(i == s.size()) {                            //如果左指標i已經到了字串末尾的下一個位置,說明後面莫得單詞了,退出迴圈
                break;
            }
            int j = i;                                    //j是右指標
            while(s[j] != ' ' && j < s.size()) {           //j指向當前單詞的下一個位置(下一個空格或者字串末尾的下一個位置)
                ++j;
            }
            string temp = s.substr(i, j - i);             //分割出當前的單詞
            words.push_back(temp);          
            i = j - 1;                                    //因為迴圈結束後有一個++i,所以這裡將i賦值為j - 1, 這樣迴圈結束後i就是j現在的位置了,可以繼續往後尋找單詞
        }
        reverse(words.begin(), words.end());               //題目要求翻轉單詞
        string res;
        for(int i = 0; i < words.size(); ++i) {   
            res += words[i];                                //將所有單詞連線起來
            if(i < words.size() - 1) {                    //每兩個單詞之間有一個空格
                res += ' ';
            }
        }
        return res;
    }
};