力扣第151题 反转字符串中的单词 c++双指针
题目
中等
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
the sky is blue
blue is sky the
示例 2:
输入:s = " hello world " 输出:"world hello" 解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = "a good example" 输出:"example good a" 解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
提示:
1 <= s.length <= 104
s
包含英文大小写字母、数字和空格' '
s
中 至少存在一个 单词
进阶:如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1)
额外空间复杂度的 原地 解法。
思路和解题方法
- 首先定义了一个空字符串
ans
用于存储最终的结果。- 获取输入字符串
s
的长度,并进行特判,如果字符串为空,则直接返回空字符串。- 定义指针
right
初始化为字符串末尾的下标。- 进入循环,循环条件为
right
大于等于0。- 在内层循环中,先通过
while
循环跳过末尾的空格,每次将right
向前移动一位,直到right
小于0或者指向的字符不是空格。- 如果
right
小于0,则表示已经遍历完整个字符串,跳出循环。- 将
right
赋值给指针left
,用于标记单词的起始位置。- 在内层循环中,再通过
while
循环向前搜索一个完整的单词,每次将left
向前移动一位,直到left
小于0或者指向的字符是空格。- 使用
substr
函数获取left+1
到right
之间的子串,即为一个完整的单词,并将其追加到结果字符串ans
中。- 在单词后面添加一个空格。
- 更新指针
right
为left
,继续搜索下一个单词。- 循环结束后,如果结果字符串
ans
不为空,则去掉最后一个字符(多余的空格)。- 返回结果字符串
ans
。
复杂度
时间复杂度:
O(n)
- 时间复杂度:O(n),其中n为输入字符串
s
的长度。算法遍历了整个字符串,时间复杂度为线性级别。
空间复杂度
O(n)
- 空间复杂度:O(n),其中n为输入字符串
s
的长度。算法需要创建一个新的字符串ans
来存储结果,其大小与输入字符串的长度相同。
c++ 代码
class Solution {
public:
string reverseWords(string s) {
string ans;
int n = s.size();
// 当输入字符串为空时,直接返回空字符串
if (n == 0)
return ans;
// 使用指针right从字符串末尾开始遍历
int right = n - 1;
while (right >= 0) {
// 跳过末尾的空格
while (right >= 0 && s[right] == ' ')
right--;
// 如果指针right小于0,表示已经遍历完整个字符串,跳出循环
if (right < 0)
break;
// 使用指针left从right开始往前搜索一个完整的单词
int left = right;
while (left >= 0 && s[left] != ' ')
left--;
// 将找到的单词追加到结果字符串ans中,并在单词后面添加一个空格
ans += s.substr(left + 1, right - left);
ans += ' ';
// 更新right指针为left,继续搜索下一个单词
right = left;
}
// 去掉结果字符串末尾多余的空格(如果有的话)
if (!ans.empty()) {
ans.pop_back();
}
return ans;
}
};
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)