剑指offer系列34:翻转单词顺序

我看到这个题目的第一想法是,按照空格把字符串分开,然后把被分开的字符串压栈。再把栈里的内容弹出组成一个字符串就可以。但是答案直接先翻转整个字符串,然后按照空格为分割翻转单个单词。这个方案不需要额外的空间。

 1 class Solution {
 2 public:
 3     string ReverseSentence(string str) {
 4 
 5         Reverse(str,0,str.size()-1);
 6         int count = 0;//给空格计数
 7         for (int i=0,j=1; i<str.size(), j<str.size(); j++)
 8         {
 9             if (str[j] == ' ')
10             {
11                 count++;
12                 if (i == j)
13                 {
14                     i = j + 1;
15                 }
16                 else {
17                     Reverse(str, i, j-1);
18                     i = j + 1;
19                 }
20             }
21         }
22         if (count == 0)
23         {
24             Reverse(str, 0, str.size() - 1);
25             return str;
26 
27         }
28         else {//如果空格数大于0,则要翻转最后一个单词,前面的for循环只能翻转空格前面的单词
29             for (int i = 0; i < str.size(); i++)
30             {
31                 if (str[i] == ' ')
32                 {
33                     count--;
34                     if(count==0)
35                         Reverse(str, i+1, str.size() - 1); 
36                 }
37                 
38             }
39             return str;
40         }
41 
42 
43     }
44     void Reverse(string &str,int start,int end)
45     {
46         if (str.empty())
47             return;
48         for (;start<end;start++,end--)
49         {
50             swap(str[start],str[end]);
51         }
52     }
53 };

左旋转字符串:举例(abcdefg),n=3;分为两部分,abc和defg。然后分别对两部分旋转得到cba和gfed。总体就是cbagfed,然后对整个字符串翻转。得到defgabc。想清楚算法在写就很简单了,主要要把这个题和上一个结合起来。

 1 class Solution {
 2 public:
 3     string LeftRotateString(string str, int n) {
 4         if (str.empty() || n < 1)
 5             return str;
 6         Reverse(str, 0, n - 1);
 7         Reverse(str,n,str.size()-1);
 8         Reverse(str, 0, str.size() - 1);
 9         return str;
10     }
11     void Reverse(string &str, int start, int end)
12     {
13         if (str.empty())
14             return;
15         for (; start < end; start++, end--)
16         {
17             swap(str[start], str[end]);
18         }
19     }
20 };

 

posted @ 2019-07-18 18:48  妮妮熊  阅读(132)  评论(0编辑  收藏  举报