标签:style blog io color ar for sp strong div
Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue
",
return "blue is sky the
".
Clarification:
标签:string
首先是最朴素的解法,利用堆栈,将所有的单词压入一个堆栈,最后再逐个pop出来,这样就能够得到反序单词的句子。单词压入堆栈的过程中,利用了单词中间没有空格的性质。思想很简单,但是在事实过程中还是出现了一点小曲折,弄了2,3次才最终accepted。
上代码:
1 class Solution{ 2 public: 3 void reverseWords(string &s){ 4 int len=s.length(); 5 int i; 6 stack <string> end; 7 i=-1; 8 string ss=""; 9 int sum=0; 10 while(1){ 11 i++; 12 if(i>(len-1)) 13 break; 14 if(s[i]==‘ ‘){// 15 if(ss.length()){//说明ss中储存的单词还没有压入堆栈,将其压入堆栈 16 sum++;//sum用于记录string中总共有多少个单词 17 end.push(ss); 18 ss=""; 19 } 20 continue; 21 } 22 else if(s[i]!=‘ ‘){ 23 ss.push_back(s[i]);//将单词中的字母放入存放单词的string中 24 } 25 } 26 if(ss.length()){//说明最后最后遗留了一个单词还没有压入堆栈,将其压入堆栈 27 end.push(ss); 28 sum++; 29 } 30 if(!sum){//如果单词数量为0,说明原来输入的string中字符全为空格,或者为空。返回空值 31 s=""; 32 return; 33 } 34 s=""; 35 for(i=0;i<sum;i++){ 36 s+=end.top(); 37 s+=" "; 38 end.pop(); 39 } 40 s.pop_back();//因为单词末尾不能有空格,将最后的空格弹出 41 42 } 43 44 };
但是上述方法过程感觉稍微有点繁杂,有必要采取另外一种思路。
首先上代码:
1 class Solution { 2 public: 3 void reverseWords(string &s) { 4 int i=s.length(); 5 i--; 6 string ss; 7 while(i>=0){ 8 while(i>=0&&s[i]==‘ ‘) 9 i--;//消除多余的空格 10 if(i<0) 11 break; 12 if(ss.length()!=0)//如果记录返回值的ss长度不为0 13 ss.push_back(‘ ‘);//将‘ ‘压入其中 14 string temp; 15 for(i;i>=0&&s[i]!=‘ ‘;i--) 16 temp.push_back(s[i]);//反序压入单词所有字母 17 reverse(temp.begin(),temp.end());//回复单词字母的顺序 18 ss.append(temp);//将单词加入ss 19 } 20 s=ss;//返回值为ss 21 22 23 24 }//返回值直接储存在s中了 25 };
上述代码感觉思路非常好,其精妙之处在与采取反序来处理字符串。再加上充分利用reverse,append等库函数,使得代码清晰易懂。
标签:style blog io color ar for sp strong div
原文地址:http://www.cnblogs.com/zhoudayang/p/4078513.html