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)的原地翻轉方法,有空研究完再補充,這個時間複雜度可能較高。