151.反转字符串中的单词

力扣题目链接

​ 给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

​ 注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

​ 示例 1:

1
2
输入:s = "the sky is blue"
输出:"blue is sky the"

​ 示例 2:

1
2
3
输入:s = "  hello world  "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。

​ 示例 3:

1
2
3
输入:s = "a good   example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

提示: 1 <= s.length <= 104 s包含英文大小写字母、数字和空格 ' ' s至少存在一个 单词

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/reverse-words-in-a-string

思路

​ 这里可以使用双指针进行遍历查找每个单词就行填充拼接。

​ (1)都初始化到字符串末端,用来指向单词首字母前一个位置,指向单词最后一个字母

​ (2)遍历查找单词,进行字符串拼接,需要注意的是当字符串前有个空格和没有空格的条件,若无空格就会更新到,此时循环跳出,更新字符串。若有空格会更新到空格位并不断直到,此时则字符串已经反转完成,直接结束。

​ (3)由于每次都+=' ',需要进行删除末尾。

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
string reverseWords(string s) {
//定义两个指针,分别指向单词开始前一个位置和单词最后一个字母
int left = s.size() - 1, right = s.size() - 1;
string ans;
//当左右指针都大于0时寻找单词进行赋值,从字符串最右端开始遍历
while(right >= 0 && left >= 0)
{
//如果right为-1说明已经反转完成,退出,遍历寻找单词最后一个字母
while(right != -1 && s.at(right) == ' ') right--;
if(right < 0) break;
//遍历寻找单词第一个字母的前一个位置
//分为第一个字符在第一个位置和第一个位置为空格两种情况,所以-1时应该停止且避免访问负位置
left = right - 1;
while(left != -1 && s.at(left) != ' ') left--;
//字符串拼接
ans.append(s, left + 1, right - left);
ans += ' ';
right = left - 1;
}
//删除多余添加的空格
ans.pop_back();
return ans;
}
};
  • 时间复杂度:,其中 是字符串长度。
  • 空间复杂度:,其中 是字符串长度。

本文封面图片由maritamar75Pixabay上发布