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;
		int	 n	= 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( "  Hello  world  i  am             a boy " );
	s.reverseWords( str );
	cout << str << endl;
}

你可能感兴趣的:(C++,算法)