Leetcode OJ: Reverse Words in a String
Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue
",
return "blue is sky the
".
单词反转,思路就是单词反转后再整句反转,只是加了一些要求,首尾的空格不能要,中间出现连续的空格都变成一个。
1 class Solution { 2 public: 3 void reverseAll(string &s, int i, int j) { 4 while(i < j) { 5 if (s[i] != s[j]) 6 swap(s[i++], s[j--]); 7 else { 8 i++; 9 j--; 10 } 11 } 12 } 13 void reverseWords(string &s) { 14 size_t len = s.size(); 15 int pre = 0; 16 int i = 0; 17 // 清除开头的空格 18 while (i < len && s[i] == ' ') 19 i++; 20 int begin = i++; 21 int k = 0; 22 // 把中间的空格合并 23 while (i < len) { 24 if (s[i - 1] == ' ' && s[i] == ' ') { 25 k++; 26 }else if (k > 0) { 27 s[i - k] = s[i]; 28 } 29 ++i; 30 } 31 len -= k; 32 // 清除结尾的空格 33 while (len > begin && s[len - 1] == ' ') 34 len--; 35 pre = begin; 36 37 // 反转单词 38 for (i = begin; i < len; ++i) { 39 if (s[i] == ' ') { 40 if (i - 1 > pre) 41 reverseAll(s, pre, i - 1); 42 pre = i + 1; 43 } 44 } 45 46 // 反转最后一个单词 47 if (pre < len - 1) 48 reverseAll(s, pre, len - 1); 49 50 // 反转整句 51 reverseAll(s, begin, len - 1); 52 if (len < s.size()) 53 s.erase(len); 54 if (begin > 0) 55 s.erase(0, begin); 56 57 } 58 };