算法入门 01线性枚举(简单 - 第二题)LeetCode 557
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法入门 01线性枚举(简单 - 第二题)LeetCode 557相关的知识,希望对你有一定的参考价值。
一、题目
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),即加法关系。
以上是关于算法入门 01线性枚举(简单 - 第二题)LeetCode 557的主要内容,如果未能解决你的问题,请参考以下文章
算法入门深度优先搜索(简单 - 第二题)LeetCode 617
算法入门广度优先搜索(中等 - 第二题)LeetCode 116
算法入门深度优先搜索(中等 - 第二题)LeetCode 46