翻转字符串里的单词一、题目描述二、题解实现1. 方法一:双指针2. 方法二:库函数3. 方法三:一行实现法 一、题目描述 题目:151.翻转字符串里的单词 难度:中等 给定一个字符串,逐个翻转字符串中的每个单词。 示例 1: 输入: “the sky is blue” 输出: “blue is sky the” 示例 2: 输入: ” hello world! “ 输出: “world! hello” 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 示例 3: 输入: “a good example” 输出: “example good a” 解释: 如果 【LeetCode笔记-翻转字符串里的单词】 在LeetCode中,第151题是“翻转字符串里的单词”,这是一道中等难度的问题。题目要求我们给定一个字符串,然后将这个字符串中的每个单词进行翻转,但保持单词内部的字符顺序不变,同时去除多余的空格。 ### 一、题目描述 给定一个字符串`s`,其内部由多个单词组成,这些单词之间可能由一个或多个空格分隔。我们需要对字符串中的每个单词进行翻转,即单词的首字符变为末字符,末字符变为首字符,以此类推。但是,单词内部的字符顺序应保持不变。另外,翻转后的字符串中,单词之间的空格数量应减至最少,仅保留一个空格。 例如: - 输入: `"the sky is blue"`,输出: `"blue is sky the"` - 输入: `" hello world! "`,输出: `"world! hello"` - 输入: `"a good example"`,输出: `"example good a"` 注意,输入字符串可能在前后包含多余的空格,但在翻转后的结果中不应包含这些多余的空格。如果两个单词间有多余的空格,只保留一个空格。 ### 二、题解实现 #### 1. 方法一:双指针 **算法解析:** 我们可以使用双指针技术来解决这个问题。从字符串末尾开始,找到一个空格,然后向前遍历直到找到下一个非空格字符,这个区间就是当前单词。将这个单词添加到结果列表中,然后继续寻找下一个单词的边界。在遍历过程中,跳过所有连续的空格。将结果列表连接成字符串返回。 **复杂度分析:** - 时间复杂度:O(N),其中N是字符串`s`的长度,需要线性遍历整个字符串。 - 空间复杂度:O(N),新建的列表(Python)或StringBuilder(Java)中的字符串总长度≤N,占用O(N)大小的额外空间。 ```python class Solution: def reverseWords(self, s: str) -> str: s = s.strip() i, j = len(s) - 1, len(s) - 1 res = [] while i >= 0: while i >= 0 and s[i] != ' ': i -= 1 res.append(s[i + 1: j + 1]) while s[i] == ' ': i -= 1 j = i return ' '.join(res) ``` #### 2. 方法二:库函数 **算法解析:** 对于Python,可以利用内置的`split()`和`reverse()`函数来简化问题。`split()`方法会将字符串按照空格分割成单词列表,而`strip()`方法用于删除首尾的空格。然后,我们可以简单地反转单词列表,最后用`join()`方法将单词重新组合为字符串。 **复杂度分析:** - 时间复杂度:O(N),总体为线性时间复杂度,各函数的时间复杂度如下: - `split()`方法:O(N) - `strip()`方法:最差情况下为O(N)(当字符串全为空格时) - `join()`方法:O(N) - `reverse()`方法:O(N) - 空间复杂度:O(N),单词列表`strs`占用线性大小的额外空间。 ```python class Solution: def reverseWords(self, s: str) -> str: s = s.strip() strs = s.split() strs.reverse() return ' '.join(strs) ``` #### 3. 方法三:一行实现法 **算法解析:** 通过一行代码实现这个问题,我们可以结合`strip()`、`split()`、`[::-1]`(反向切片)和`join()`操作,一次性完成翻转单词、处理多余空格和合并字符串的操作。 **复杂度分析:** 与方法二相同。 ```python class Solution: def reverseWords(self, s: str) -> str: return ' '.join(s.strip().split()[::-1]) ``` 以上三种方法都能有效地解决LeetCode第151题,其中方法一和方法三适用于需要考虑空间复杂度限制的情况,而方法二则是一种简洁明了的解决方案,但可能在面试场合不太常见。
- 粉丝: 4
- 资源: 903
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Delphi的TFileStream类来创建一个文本文件
- 算法编排API接口协议定义与组件配置
- stm32单片机原理及应用-跑马灯实验-STM32F103
- c++小游戏(整合版)
- object-c项目在iOS应用显示一个标签
- dba专业级mysql运维操作手册
- postgresql 14.0版(Windows&Linux).zip
- 车载空调模型,电动汽车空调模型,MATLAB simulink逻辑门限值控制算法,车载空调系统模型+控制策略+建模公式+word
- 基于CODESYS开发的多轴运动控制程序框架将逻辑和运动控制分开,通过封装单轴控制功能块来操作该功能块,包括归零、点动、相对定位
- 基于51单片机的智能鱼缸设计 有原理图,程序,原文 才用STC12C5A60S2,最新款国产51单片机 本系统设计的主要是基