1. 程式人生 > 實用技巧 >leetcode_位元組跳動_挑戰字串_翻轉字串裡的單詞

leetcode_位元組跳動_挑戰字串_翻轉字串裡的單詞

翻轉字串裡的單詞

給定一個字串,逐個翻轉字串中的每個單詞。

示例 1:

輸入: "the sky is blue"
輸出:"blue is sky the"

示例 2:

輸入: " hello world! "
輸出:"world! hello"
解釋: 輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。

示例 3:

輸入: "a good  example"
輸出:"example good a"
解釋: 如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。

說明:

  • 無空格字元構成一個單詞。
  • 輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。
  • 如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。

進階:

請選用 C 語言的使用者嘗試使用O(1) 額外空間複雜度的原地解法。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

這個題目很有親切感,大一上的c語言入門時,就在學校oj碰到過這個題目,後來當助教更是重溫了一下。

以前做這個字串的分割題目時,總是會用到迴圈判斷是不是某個字元,直到後來編譯原理學會了strtok這個函式,從此真香一發不可收拾。

strtok

描述

C 庫函式char *strtok(char *str, const char *delim)分解字串str為一組字串,delim為分隔符。

宣告

下面是 strtok() 函式的宣告。

char *strtok(char *str, const char *delim) //第一個是待分割的字串,後面的是分隔符。

引數

  • str-- 要被分解成一組小字串的字串。
  • delim-- 包含分隔符的 C 字串。

返回值

該函式返回被分解的第一個子字串,如果沒有可檢索的字串,則返回一個空指標。

例項

下面的例項演示了 strtok() 函式的用法。

例項

        string s;
        char *p;
        p = strtok((char*)s.c_str()," ");//第一個子串
        while(p!=NULL){
            p = strtok(NULL," ");//之後的子串
        }    

要是在一個字串中有不同的分隔符,則轉換分隔符時要把NULL變成下一個分隔符。

---------------------------------------------------回到題目---------------------------------------------------------------------------------------------

當我們學會了分割一切都變得簡單了,只需要分割完倒過來就行,我選擇了使用容器vector暫時儲存子串,最後倒過來。

class Solution {
public:
    string reverseWords(string s){
        if(s.length()==0) return "";//
        
        vector<string> res;
        char *p;
        p = strtok((char*)s.c_str()," ");
        
        while(p!=NULL){
            res.push_back(p);
            p = strtok(NULL," ");
        }
        string r="";
        for(int i=res.size()-1;i>=0;i--){
            r+=res[i];
            if(i!=0) r+=" ";
        }
        //cout<<r<<endl;
        return r;
    }
};

-------------------------------------------------------------------------------------隨意的分割線------------------------------------------------------------------------------------

題目說還有空間O(1)的原地翻轉方法,有空研究完再補充,這個時間複雜度可能較高。