Given a string, you need to reverse the character order of each word in the string while still preserving the initial order of spaces and words.
Example 1:
Input: "Let's take LeetCode contest" Output: "s'teL ekat edoCteeL tsetnoc"
Note: in a string, each word is separated by a single space, and there are no extra spaces in the string.
I'm tired of this problem. I started to exceed the memory space limit
Failed solution and code: just stack each word, and then stack it once
class Solution { public: string reverseWords(string s) { stack<char> tmp; string result; int i = 0; for(string::iterator iter = s.begin(); iter != s.end();iter++) { if(*iter != ' ') { tmp.push(*iter); } if(*iter == ' '|| *(iter + 1) == NULL) { while(!tmp.empty()) { result = result + tmp.top(); tmp.pop(); } if(*(iter + 1)) result = result + ' '; } } return result; } };
The final solution is as follows:
class Solution { public: string reverseWords(string s) { vector<int> a; if(s.empty()) return s; int i = 0; for(auto c:s) { if(c == ' ') a.push_back(i); i++; } int size = a.size(); if(size == 0) { reverse(s.begin(),s.end()); return s; } reverse(s.begin(),s.begin()+a[0]); for(int j = 0;j < size - 1;j++) { //cout << *(s.begin() + a[j]); reverse(s.begin() + a[j] + 1, s.begin() + a[j + 1]); } reverse(s.begin()+a[size-1]+1,s.end()); return s; } };