leetcode 151. 翻转字符串里的单词 medium
题目描述:
给定一个字符串,逐个翻转字符串中的每个单词。
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
解题思路:
可以先每个单词反转,再把整个字符串反转,也可以先把整个字符串反转了,再把每个单词给反转了
代码:
class Solution {
public:
string reverseWords(string s) {
// 每一段开始处理的地方
int k=0;
for(int i=0;i<s.size();++i){
// 找到这一部分不是空格的首字母
int start=i;
while(start<s.size() && s[start]==' ')
++start;
// 这一部分可能没有字符
if(start==s.size())
break;
//找到这一部分 最后一个字符的后一个位置
int end=start;
while(end<s.size() && s[end] !=' ')
++end;
//反转这个单词
reverse(s.begin()+start,s.begin()+end);
//每个单词给它前面加个空格
if(k!=0) s[k++]=' ';
// 复制这一部分单词
while(start<end){
s[k++]=s[start++];
}
i=end;
}
s.erase(s.begin()+k,s.end());
reverse(s.begin(),s.end());
return s;
}
};