⭐算法入门⭐《线性枚举》简单02 —— LeetCode 557. 反转字符串中的单词 III

饭不食,水不饮,题必须刷

C语言免费动漫教程,和我一起打卡!
光天化日学C语言

LeetCode 太难?先看简单题!
C语言入门100例

数据结构难?不存在的!
数据结构入门

LeetCode 太简单?算法学起来!
夜深人静写算法

文章目录

  • 一、题目
    • 1、题目描述
    • 2、基础框架
    • 3、原题链接
  • 二、解题报告
    • 1、思路分析
    • 2、时间复杂度
    • 3、代码详解
  • 三、本题小知识

一、题目

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、原题链接

LeetCode 557. 反转字符串中的单词 III

二、解题报告

1、思路分析

  记录一个 p r e pre pre 变量,初始化为 0,然后开始枚举整个字符串,只要遇到空格或者字符串结尾,令当前枚举的位置为 i i i,我们就将 [ p r e , i − 1 ] [pre, i-1] [pre,i1] 的字符逆序放入结果字符串中,并且再加上一个空格(如果是遇到字符串结尾,则不加入空格)。枚举完毕,将结果字符串返回即可。

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 i1 的部分;
  • ( 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),即加法关系。


你可能感兴趣的:(《LeetCode算法全集》,LeetCode,算法,算法入门,线性枚举,字符串翻转)