【38】186. Reverse Words in a String II
186. Reverse Words in a String II
Description Submission Solutions Add to List
- Total Accepted: 21466
- Total Submissions: 76192
- Difficulty: Medium
- Contributors: Admin
Given an input string, reverse the string word by word. A word is defined as a sequence of non-space characters.
The input string does not contain leading or trailing spaces and the words are always separated by a single space.
For example,
Given s = "the sky is blue
",
return "blue is sky the
".
Could you do it in-place without allocating extra space?
Related problem: Rotate Array
Solution:
1 class Solution { 2 public: 3 //此题解法:先把每个单词翻转一下,再翻转整个字符串(为了整个单词的大顺序是反过来的)。或者先翻转整个字符串,再翻转每个单词。 4 void reverseWords(string &s) { 5 reverse(s.begin(), s.end()); 6 int n = s.length(), l = 0, r = 0; 7 while (r < n) { 8 while (r < n && !isspace(s[r])) r++;//用isspace判断 可以避免下例的情况hi! 9 reverse(s.begin() + l, s.begin() + r); 10 l = ++r; 11 } 12 } 13 };
以下方法过不了 test case: hi! 输出是!ih 而不是hi! ?????????????
1 class Solution { 2 public: 3 //此题解法:先把每个单词翻转一下,再翻转整个字符串(为了整个单词的大顺序是反过来的)。或者先翻转整个字符串,再翻转每个单词。 4 void reverseWords(string &s) { 5 int left = 0; 6 for(int i = 0; i <= s.size(); i++){ 7 if(s[i] == ' ' || i == s.size()){//遇到每个空格或者到最后的时候(因为没空格)要翻转 8 //reverse(s, left, i - 1);//从左边界翻转到空格左边,此为一整个单词 9 reverse(s.begin() + left, s.begin() + i - 1); 10 left = i + 1;//更新左边界,到空格右边第一个 11 } 12 13 } 14 //reverse(s, 0, s.size() - 1); 15 reverse(s.begin(), s.end()); 16 } 17 /* 18 void reverse(string& s, int left, int right){ 19 while(left < right){ 20 char tmp = s[left]; 21 s[left] = s[right]; 22 s[right] = tmp; 23 left ++; 24 right --; 25 } 26 }*/ 27 };