557. 反转字符串中的单词 III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例:
输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
思路
遍历字符串,遇到一个空格,就把空格之前的字符串反转。反转有两种方法
(1)构造新的字符串,把原子字符串逆序保存;
(2)原地交换子字符串的首尾,然后往中间靠拢。
代码
方法一:构造新的字符串
class Solution {
public:
string reverseWords(string s) {
int len = s.size();
int i = 0;//子字符串首位置
int j = 0;//子字符串尾位置+1
string ans;
while(j<len){
//找到空格
if (s[j] == ' '){
int end = j - 1;
//从后遍历,逆序保存
while (end>=i){
ans.push_back(s[end--]);
}
ans.push_back(' ');
i = j+1;
}
j++;
}
j = j-1;
//因为原字符串最后不是空格,所以最后一个单词需要单独逆序保存
while(j>=i)
ans.push_back(s[j--]);
return ans;
}
};
方法二:原地逆序
class Solution {
public:
string reverseWords(string s) {
int length = s.length();
int i = 0;
while (i < length) {
int start = i;
while (i < length && s[i] != ' ') {
i++;
}
int left = start, right = i - 1;
//swap()交换位置
while (left < right) {
swap(s[left], s[right]);
left++;
right--;
}
while (i < length && s[i] == ' ') {
i++;
}
}
return s;
}
};