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