給定一個字符串,逐個翻轉字符串中的每一個單詞。編程
示例 1:app
輸入: "" 輸出: "" the sky is blueblue is sky the
示例 2:函數
輸入: " hello world! " 輸出: "world! hello" 解釋: 輸入字符串能夠在前面或者後面包含多餘的空格,可是反轉後的字符不能包括。
示例 3:spa
輸入: "a good example" 輸出: "example good a" 解釋: 若是兩個單詞間有多餘的空格,將反轉後單詞間的空格減小到只含一個。
說明:指針
進階:code
請選用 C 語言的用戶嘗試使用 O(1) 額外空間複雜度的原地解法。blog
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ip
這個題目頗有親切感,大一上的c語言入門時,就在學校oj碰到過這個題目,後來當助教更是重溫了一下。字符串
之前作這個字符串的分割題目時,老是會用到循環判斷是否是某個字符,直到後來編譯原理學會了strtok這個函數,今後真香一發不可收拾。string
C 庫函數 char *strtok(char *str, const char *delim) 分解字符串 str 爲一組字符串,delim 爲分隔符。
下面是 strtok() 函數的聲明。
char *strtok(char *str, const char *delim) //第一個是待分割的字符串,後面的是分隔符。
該函數返回被分解的第一個子字符串,若是沒有可檢索的字符串,則返回一個空指針。
下面的實例演示了 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)的原地翻轉方法,有空研究完再補充,這個時間複雜度可能較高。