【数据结构和算法】反转字符串中的单词

简介: 给你一个字符串s,请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。注意:输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

其他系列文章导航

Java基础合集

数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

2.1 方法一:双指针

2.2 方法二:分割 + 倒序

三、代码

3.1 方法一:双指针

3.2 方法二:分割 + 倒序

四、复杂度分析

4.1 方法一:双指针

4.2 方法二:分割 + 倒序


前言

这是力扣的151题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的两种。


一、题目描述

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "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) 额外空间复杂度的 原地 解法。


    二、题解

    2.1 方法一:双指针

    思路与算法:

      • 先去首尾空格。
      • 倒序遍历字符串 s ,记录单词左右索引边界 i , j 。
      • 每确定一个单词的边界,则将其添加至单词列表 res 。
      • 最终,将单词列表拼接为字符串,去掉尾部空格,并返回即可。

      2.2 方法二:分割 + 倒序

      思路与算法:

      以空格为分割符完成字符串分割后,若两单词间有 x>1 个空格,则在单词列表 strs 中,此两单词间会多出 x−1 个 “空单词” (即 "" )。

      解决方法:倒序遍历单词列表,并将单词逐个添加至 StringBuilder ,遇到空单词时跳过。


      三、代码

      3.1 方法一:双指针

      Java版本:

      class Solution {
          public String reverseWords(String s) {
              s = s.trim();                                          // 删除首尾空格
              int j = s.length() - 1, i = j;
              StringBuilder res = new StringBuilder();
              while (i >= 0) {
                  while (i >= 0 && s.charAt(i) != ' ') i--;          // 搜索首个空格
                  res.append(s.substring(i + 1, j + 1)).append(" "); // 添加单词
                  while (i >= 0 && s.charAt(i) == ' ') i--;          // 跳过单词间空格
                  j = i;                                             // j 指向下个单词的尾字符
              }
              return res.toString().trim();                          // 转化为字符串并返回
          }
      }

      image.gif

      Python版本:

      class Solution:
          def reverseWords(self, s: str) -> str:
              s = s.strip()                            # 删除首尾空格
              i = j = len(s) - 1
              res = []
              while i >= 0:
                  while i >= 0 and s[i] != ' ': i -= 1 # 搜索首个空格
                  res.append(s[i + 1: j + 1])          # 添加单词
                  while i >= 0 and s[i] == ' ': i -= 1 # 跳过单词间空格
                  j = i                                # j 指向下个单词的尾字符
              return ' '.join(res)                     # 拼接并返回

      image.gif

      3.2 方法二:分割 + 倒序

      Java版本:

      class Solution {
          public String reverseWords(String s) {
              String[] split = s.trim().split(" ");
              StringBuilder res = new StringBuilder();
              for (int i = split.length - 1; i >= 0; i--) {
                  if (!split[i].equals("")) {
                      res.append(split[i]).append(" ");
                  }
              }
              return res.toString().trim();
          }
      }

      image.gif

      Python版本:

      class Solution:
          def reverseWords(self, s: str) -> str:
              return ' '.join(s.strip().split()[::-1])

      image.gif


      四、复杂度分析

      4.1 方法一:双指针

        • 时间复杂度 O(N) : 其中 N 为字符串 s 的长度,线性遍历字符串。
        • 空间复杂度 O(N) : 新建的 list(Python) 或 StringBuilder(Java) 中的字符串总长度 ≤ N ,占用 O(N) 大小的额外空间。

        4.2 方法二:分割 + 倒序

          • 时间复杂度 O(N) : 总体为线性时间复杂度,各函数时间复杂度和参考资料链接如下。
            • split() 方法: 为 O(N) 。
            • trim() 和 strip() 方法: 最差情况下(当字符串全为空格时),为 O(N) 。
            • join() 方法: 为 O(N) 。
            • reverse() 方法: 为 O(N) 。
              • 空间复杂度 O(N) : 单词列表 strs 占用线性大小的额外空间。
              目录
              相关文章
              |
              3月前
              |
              存储 监控 安全
              企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
              企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
              85 1
              |
              3月前
              |
              存储 监控 算法
              基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
              跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
              97 0
              |
              7月前
              |
              存储 算法 Java
              算法系列之数据结构-二叉树
              树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
              204 10
               算法系列之数据结构-二叉树
              |
              7月前
              |
              算法 Java
              算法系列之数据结构-Huffman树
              Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
              166 3
               算法系列之数据结构-Huffman树
              |
              7月前
              |
              算法 Java
              算法系列之数据结构-二叉搜索树
              二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
              219 22
              |
              8月前
              |
              存储 机器学习/深度学习 算法
              C 408—《数据结构》算法题基础篇—链表(下)
              408考研——《数据结构》算法题基础篇之链表(下)。
              207 30
              |
              15天前
              |
              传感器 机器学习/深度学习 编解码
              MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
              MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
              127 3
              |
              20天前
              |
              存储 编解码 算法
              【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
              【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
              |
              9天前
              |
              机器学习/深度学习 算法 数据可视化
              基于MVO多元宇宙优化的DBSCAN聚类算法matlab仿真
              本程序基于MATLAB实现MVO优化的DBSCAN聚类算法,通过多元宇宙优化自动搜索最优参数Eps与MinPts,提升聚类精度。对比传统DBSCAN,MVO-DBSCAN有效克服参数依赖问题,适应复杂数据分布,增强鲁棒性,适用于非均匀密度数据集的高效聚类分析。
              |
              9天前
              |
              开发框架 算法 .NET
              基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
              简介:本文介绍基于ADMM的MIMO信号检测算法,结合无穷范数优化与交替方向乘子法,降低计算复杂度并提升检测性能。涵盖MATLAB 2024b实现效果图、核心代码及详细注释,并对比ML、MMSE、ZF、OCD_MMSE与LAMA等算法。重点分析LAMA基于消息传递的低复杂度优势,适用于大规模MIMO系统,为通信系统检测提供理论支持与实践方案。(238字)

              热门文章

              最新文章