码迷,mamicode.com
首页 > 其他好文 > 详细

Reverse Words in a String (4)

时间:2014-11-06 14:23:16      阅读:137      评论:0      收藏:0      [点我收藏+]

标签: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:

 

    • What constitutes a word?
      A sequence of non-space characters constitutes a word.//单词中间没有空格
    • Could the input string contain leading or trailing spaces?//有前导空格或者结尾有空格
      Yes. However, your reversed string should not contain leading or trailing spaces.
    • How about multiple spaces between two words?//单词之间的空格可能有多个
      Reduce them to a single sp
      ace in the reversed string.//要将单词之间的空格减少为1个

标签: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等库函数,使得代码清晰易懂。

Reverse Words in a String (4)

标签:style   blog   io   color   ar   for   sp   strong   div   

原文地址:http://www.cnblogs.com/zhoudayang/p/4078513.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!