557. 反转字符串中的单词 III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例:
输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"
提示:
- 在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string-iii。
- 以空格区分每个单词,将单词单独做字符串反转,注意判断最后一个单词。
class Solution {
public:
string reverseWords(string s) {
string result;
string tmp_word;
for (int i = 0; i < s.size(); ++i) {
if (i == s.size() - 1) {
tmp_word.push_back(s[i]);
reverseWord(tmp_word);
result += tmp_word;
break;
}
if (s[i] == ' ') {
reverseWord(tmp_word);
result += tmp_word;
result += ' ';
tmp_word.clear();
} else {
tmp_word.push_back(s[i]);
}
}
return result;
}
void reverseWord(string& word) {
int left = 0;
int right = word.size() - 1;
while (left < right) {
std::swap(word[left], word[right]);
++left;
--right;
}
}
};
- 优化时间和空间复杂度
class Solution {
public:
string reverseWords(string s) {
int i = 0;
int N = s.size();
while (i < N) {
int w_left = i;
while (s[i] != ' ' && i < N) {
++i;
}
int w_right = i - 1;
while (w_left < w_right) {
std::swap(s[w_left], s[w_right]);
++w_left;
--w_right;
}
++i;
}
return s;
}
};