reverse word in a string(leetcode)
阿新 • • 發佈:2018-11-09
Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue
",
return "blue is sky the
".
- What constitutes a word?
A sequence of non-space characters constitutes a word. - Could the input string contain leading or trailing spaces?
Yes. However, your reversed string should not contain leading or trailing spaces. - How about multiple spaces between two words?
Reduce them to a single space in the reversed string. - 方法就是先將整個string翻轉,然後再將多餘空格變為一個空格,在將其中每個單詞翻轉即可。
- 我為了避免調整空格的繁瑣移動操作,就直接另建一string,保留每個word的翻轉結果,最後將其賦值給s即可
class Solution { public: void reverseWords(string &s) { if( s.empty() ) { return; } reverse( s.begin(),s.end() ); string::iterator left = s.begin(),right = s.begin(); enum{ OFF,ON } state; state = OFF; string s1; for( string::iterator i = s.begin();i != s.end();i++ ) { if( *i != ' ' ) { if( !state ) { left = i; state = ON; } } else if( *i == ' ' ) { if( state ) { right = i; s1 += reverse( left,right ) + ' '; state = OFF; } } } if( s[s.size() - 1] != ' ') s1 += reverse( left,s.end() ); if( s1[s1.size() - 1] == ' ') s1.erase( s1.end() - 1 ); s = s1; } string reverse( string::iterator left,string::iterator right ) { char c; for( string::iterator it1 = left,it2 = right - 1;it1 < it2;it1++,it2-- ) { c = *it1; *it1 = *it2; *it2 = c; } string str( left,right ); return str; } };