C++|151. 翻转字符串里的单词 Leecode C++

题目简介 【C++|151. 翻转字符串里的单词 Leecode C++】给定一个字符串,逐个翻转字符串中的每个单词。
示例:
输入: “the sky is blue”,
输出: “blue is sky the”.
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶: 请选用C语言的用户尝试使用 O(1) 空间复杂度的原地解法。
思路 这道题感觉是 557. 反转字符串中的单词 III 的升级版本,主要是将整个字符串反转,然后在将每个词反转一下就ok啦。

#include #include #include #include #include using namespace std; class Solution { public: void reverseWords( string &s ) { if ( s.size() <= 0 ) return; string::iterator it = s.begin(), bef; intn = 0; /* 全部逆序 */ reverse( s.begin(), s.end() ); /* 除去前面的空格 */ for (; *it == ' '; ++it, ++n ); if ( n > 0 ) s = s.substr( n ); bef = it = s.begin(); while ( it != s.end() ) { if ( *it == ' ' ) { reverse( bef, it ); if ( it + 1 >= s.end() ) break; /*越界,直接返回 */ if ( *(it - 1) == ' ' ) { bef = it - 1; while ( bef >= s.begin() && *bef == ' ' ) --bef; bef = bef + 2; } else bef = it + 1; while ( it <= s.end() && *it == ' ' ) ++it; /* 移动到下一个字符 */ } else ++it; }n = s.size() - 1; while ( n >= 0 && s[n] == ' ' ) --n; if ( n != s.size() - 1 ) s = s.substr( 0, n + 1 ); else { reverse( bef, it ); } } }; int main() { Solution s; string str = string( "Helloworldiama boy " ); s.reverseWords( str ); cout << str << endl; }

    推荐阅读