Reverse Words in a String

方法一:用堆栈做的,比较麻烦,思想是在字符串中提取各个单词,然后放在栈中,然后再一个一个的弹出来就OK了。执行时间是88ms。

#include <iostream>
#include<stack>
#include<string>


using namespace std;

class Solution {
public:
    void reverseWords(string &s) {

       stack<string> st;
       int k=0;

      for(int i=0;i<s.size()+1;i++)
      {
          int j=0;
          if(s[i] ==' '|| s[i]=='\0')
          {
              j=i;
               while(s[++i]==' ');
               i--;
          string tmp="";
          for(int t=k;t<j;t++)
          {
              string z=" ";
              z[0]=s[t];
              tmp += z;
          }
          st.push(tmp);
          k=i+1;
          }
      }
      string tmp2="";
      while(st.size())
      {
          if(st.top()!="")
        {tmp2 += st.top();

         tmp2+=" ";}
          st.pop();
      }

       s=tmp2;
       if(s.size())
       s.resize(s.size()-1);
      for(int i=0;i<s.length();i++)
        cout<<s[i]<<endl;


    }
};
int main()
{
   Solution s ;
   string a="za";
      s.reverseWords(a);
      cout<<"a"<<a<<"b";
}

 方法二:经大神指导,换个思路,首先这个字符串收尾对调(“the sky is blue ”变为“eulb si yks eht”),然后再遍历字符串,将每个单词对调。执行时间是48ms。

 1 #include <iostream>
 2 #include<stack>
 3 #include<string>
 4 
 5 
 6 using namespace std;
 7 
 8 class Solution {
 9 public:
10     void reverseWords(string &s) {
11          int k=0;
12          while(s[s.size()-1]==' ')
13             s.resize(s.size()-1);
14 
15          swap(s,0,s.size());
16 
17           while(s[s.size()-1]==' ')
18             s.resize(s.size()-1);
19 
20        for(int i=0;i<s.size()+1;i++)
21        {
22            if(s[i]==' ' || s[i] == '\0')
23            {
24                swap(s,k,i);
25            while(s[++i]==' ')
26            {
27                s=s.replace(i,1,"");
28                i--;
29            }
30 
31               k=i--;
32 
33            }
34        }
35     }
36     void swap(string &s,int k,int j)
37     {
38         int count=j-k;
39         for(int i=0;i<(count+1)/2;i++)
40         {
41             char tmp;
42             tmp=s[k];
43             s[k]=s[j-1];
44             s[j-1]=tmp;
45             k++;
46             j--;
47         }
48     }
49 };
50 int main()
51 {
52    Solution s ;
53    string a="1        1";
54       s.reverseWords(a);
55       cout<<"a"<<a<<"b";
56 }

方法三:将字符串转换为字符串流,然后再反转,只不过效率比较低。感兴趣的可以自己尝试。

 

posted @ 2014-04-19 10:48  醉剑客  阅读(164)  评论(0编辑  收藏  举报