151. 翻转字符串里的单词 I
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
解题思路:
- 先整体反转
- 确定子串的起始位置和结束位置。向前移动,局部反转。
- 删除末尾多余的空格。
C++实现:
class Solution {
public:
string reverseWords(string s) {
int length = s.size();
int pos = 0;
if(length == 0){
return "";
}
//先翻转整个字符串
reverse(s.begin(),s.end());
for (int start = 0; start < length; ++start) {
if (s[start] != ' ') {//找到了下一个字符串的起点
if (pos != 0) { //放一个空格做间隔
s[pos++] = ' ';
}
int loc = start;
while (loc < length && s[loc] != ' ') {//前移
s[pos++] = s[loc++];
}
reverse(s.begin() + pos - (loc - start), s.begin() + pos); //局部反转
start = loc;
}
}
s.erase(s.begin() + pos, s.end());//末尾可能有多余空格
return s;
}
};
Python实现:
- 注意:python中split()和split(’ ')的区别
- 由于 split()方法将单词间的 “多个空格看作一个空格” ,因此不会出现多余的 “空单词” 。因此,直接利用 reversed()方法翻转单词列表 str ,拼接为字符串并返回即可。
class Solution:
def reverseWords(self, s: str) -> str:
return " ".join(reversed(s.split()))
186. 翻转字符串里的单词 II
示例:
输入: [“t”,“h”,“e”," “,“s”,“k”,“y”,” “,“i”,“s”,” “,“b”,“l”,“u”,“e”]
输出: [“b”,“l”,“u”,“e”,” “,“i”,“s”,” “,“s”,“k”,“y”,” ",“t”,“h”,“e”]
注意:
- 单词的定义是不包含空格的一系列字符
- 输入字符串中不会包含前置或尾随的空格
- 单词与单词之间永远是以单个空格隔开的
- 进阶:使用 O(1) 额外空间复杂度的原地解法。
思路:先反转每个单词,然后总体再翻转。
class Solution {
public:
string ReverseWord(string str) {
int start=0;
for(int i=0;i<str.size();i++){
if(str[i]==' '){
Reverse(str,start,i-1);
start=i+1;
}
}
Reverse(str,start,str.size()-1);
Reverse(str,0,str.size()-1);
return str;
}
private:
void Reverse(string &str, int begin, int end){
while(begin < end){
swap(str[begin++], str[end--]);
}
}
};
本文介绍了一种算法,用于翻转字符串中的每个单词,包括去除多余空格和确保单词间仅保留一个空格。提供了C++和Python两种语言的实现代码。
278

被折叠的 条评论
为什么被折叠?



