题目引自leetcode: https://leetcode-cn.com/problems/reverse-words-in-a-string/
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
该题目主要先将整个字符串翻转,然后检测每个单词,再对每个单词进行翻转.
以下代码主要亮点是没有新增加空间来存储新的字符串,所有操作都是在原字符串空间上完成的
class Solution {
public:
string reverseWords(string s) {
if (s.size() == 0) return string("");
//翻转整个字符串
int i = 0;
int j = s.size()-1;
while (j > i)
{
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
i++;
j--;
}
i = 0;
j = 0;
int m = 0;
int cur_index = 0;
// 翻转每个单词
while (m < s.size())
{
if (s[m] == ' ') //寻找单词开始的位置
{
m++;
}
else
{
//添加空格, 如果是第一个单词,则前面不添加空格
if (cur_index !=0)
{
s[cur_index] = ' ';
cur_index++;
}
int begin_index = cur_index;
while (m < s.size()) //寻找单词结束的位置
{
if (s[m] == ' ') break;
if (m != cur_index)
{
s[cur_index] = s[m];
}
cur_index++;
m++;
}
//翻转该单词
i = begin_index;
j = cur_index-1;
while (j > i)
{
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
i++;
j--;
}
}
}
//删除多余的空间
if (cur_index < s.size())
s.erase(cur_index, s.size()-cur_index);
return s;
}
};
结果:
第一次有这么好的成绩,激动!!!