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;
}
推荐阅读
- opencv|opencv C++模板匹配的简单实现
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- c++基础概念笔记
- 牛逼!C++开发的穿越丛林真人游戏,游戏未上线就有百万人气
- 华为可翻转全面屏手机专利亮相(折叠方式好比翻书一样)
- C++Primer之|C++Primer之 函数探幽
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- QML基础信息
- 【数组题】给定一个二进制矩阵|【数组题】给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。
- C++-类型转换