
🙉饭不食,水不饮,题必须刷🙉
C语言免费动漫教程,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?先看简单题! 🧡《C语言入门100例》🧡
数据结构难?不存在的! 🌳《数据结构入门》🌳
LeetCode 太简单?算法学起来! 🌌《夜深人静写算法》🌌
一、题目
1、题目描述
给定一个字符串,需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
样例输入:“abc defg hi”
样例输出:“cba gfed ih”。
2、基础框架
- c++ 版本给出的基础框架代码如下,传入参数是一个
string,返回值也是string; string是 c++ 的 STL 中的模板类,支持动态扩容,有关于string动态扩容的可以参考一下这篇文章:《C/C++ 面试 100 例》(五)string 扩容策略。
class Solution {
public:
string reverseWords(string s) {
}
};

3、原题链接
二、解题报告
1、思路分析
记录一个 p r e pre pre 变量,初始化为 0,然后开始枚举整个字符串,只要遇到空格或者字符串结尾,令当前枚举的位置为 i i i,我们就将 [ p r e , i − 1 ] [pre, i-1] [pre,i−1] 的字符逆序放入结果字符串中,并且再加上一个空格(如果是遇到字符串结尾,则不加入空格)。枚举完毕,将结果字符串返回即可。
2、时间复杂度
- 线性枚举时间复杂度为 O ( n ) O(n) O(n),字符逆序放入结果数组的过程中也是 O ( n ) O(n) O(n)。但是两者是相加的关系,所以总的时间复杂度还是 O ( n ) O(n) O(n)。
3、代码详解
class Solution {
public:
string reverseWords(string s) {
string ans = ""; // (1)
int pre = 0; // (2)
for(int i = 0; i <= s.length(); ++i) { // (3)
if(i == s.length() || s[i] == ' ') { // (4)
for(int j = i-1; j >= pre; --j) {
ans.push_back(s[j]); // (5)
}
if(i < s.length()) // (6)
ans.push_back(' ');
pre = i + 1; // (7)
}
}
return ans;
}
};
-
(
1
)
(1)
(1) 初始化结果字符串
ans为空字符串; -
(
2
)
(2)
(2) 初始化
pre变量为 0,代表从字符串下标 0 开始; -
(
3
)
(3)
(3) 注意这里需要枚举到
s.length(),以空格分隔的字符串最后部分会漏掉; - ( 4 ) (4) (4) 遇到字符串结尾或者空格,就开始处理从 p r e pre pre 到 i − 1 i-1 i−1 的部分;
-
(
5
)
(5)
(5) 对这部分字符,逆序放进结果数组中,采用
push_back接口; - ( 6 ) (6) (6) 如果不是字符串结尾,则补上一个空格;
- ( 7 ) (7) (7) 更新 p r e pre pre 的位置 为空格下一个字符的下标;
三、本题小知识
两个 for 循环嵌套枚举时,算法时间复杂度不一定是 O ( n 2 ) O(n^2) O(n2),即不一定是乘法关系,也有可能是 O ( n ) O(n) O(n),即加法关系。

本文介绍如何使用C++解决LeetCode的557题,即反转字符串中的每个单词顺序,同时保留空格和单词的初始顺序。通过提供一个基础框架,解析解题思路,详细讲解时间复杂度和代码实现,帮助读者理解字符串处理和算法应用。
630

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



