给定一个字符串,逐个翻转字符串中的每个单词。
示例 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)的原地翻转方法,有空研究完再补充,这个时间复杂度可能较高。