算法入门 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、原题链接

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),即加法关系。


以上是关于算法入门 01线性枚举(简单 - 第二题)LeetCode 557的主要内容,如果未能解决你的问题,请参考以下文章

算法入门深度优先搜索(简单 - 第二题)LeetCode 617

算法入门双指针(中等 - 第二题)LeetCode 567

算法入门广度优先搜索(中等 - 第二题)LeetCode 116

算法入门深度优先搜索(中等 - 第二题)LeetCode 46

算法入门 01线性枚举(简单 - 第三题)LeetCode 876

算法入门 01线性枚举(简单 - 第一题)LeetCode 344