151.反转字符串中的单词
1 2 3 4
| ```
[力扣题目链接](https://leetcode.cn/problems/reverse-words-in-a-string/)
|
给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = “the sky is blue”
输出:“blue is sky the”
示例 2:
输入:s = " hello world "
输出:“world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = “a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
1 2 3 4 5 6 7 8 9 10 11
| 提示: `1 <= s.length <= 104` `s `包含英文大小写字母、数字和空格 `' '` `s` 中 **至少存在一个** 单词
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/reverse-words-in-a-string
## 思路
|
这里可以使用双指针进行遍历查找每个单词就行填充拼接。
(1)
1 2 3
| $left$和$right$都初始化到字符串末端,$left$用来指向单词首字母前一个位置,$right$指向单词最后一个字母
|
(2)遍历查找单词,进行字符串拼接,需要注意的是当字符串前有
1 2 3
| $n$个空格和没有空格的条件,若无空格$left$就会更新到$-1$,此时循环跳出,更新字符串。若有空格$right$会更新到空格位并不断$-1$直到$-1$,此时则字符串已经反转完成,直接结束。
|
(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 27 28 29 30 31 32 33 34
| `+=' '`,需要进行删除末尾。

## 实现代码
```cpp 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; } };
|
- 时间复杂度:O(n),其中 n 是字符串长度。
- 空间复杂度:O(n),其中 n 是字符串长度。
本文封面图片由maritamar75在Pixabay上发布