给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue
" 输出: "blue is sky the
"示例 2:
输入: " hello world! " 输出: "world! hello" 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:
输入: "a good example" 输出: "example good a" 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
解法一:
//时间复杂度O(n), 空间复杂度O(n)
class Solution {
public:
inline void reverseWord(string& s, int i, int j) {
while(i < j) swap(s[i++], s[j--]);
}
void rearange(string& s) {
int i = 0, j = 0;
while(j < s.size() && s[j] == ' ') j++;
while(j < s.size()) {
while(j < s.size() && s[j] != ' ') s[i++] = s[j++];
if(j == s.size()) {
s = s.substr(0, i);
return;
}
while(j < s.size() && s[j] == ' ') j++;
if(j < s.size()) s[i++] = ' ';
}
s = s.substr(0, i);
}
string reverseWords(string s) {
rearange(s);
reverseWord(s, 0, s.size() - 1);
int i = 0, j = 0;
while(i < s.size()) {
while(j < s.size() && s[j] != ' ') j++;
reverseWord(s, i, j - 1);
i = j + 1;
j = i;
}
return s;
}
};
解法一:
首先对整个字符串进行除去多余空格处理,然后再将整个字符串反转,最后再对每个单词反转。
2019/12/26 14:08