拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AlgoNote 算法通关手册题解:0151. 反转字符串中的单词(双指针 + 字符串,中等)

AlgoNote 算法通关手册题解:0151. 反转字符串中的单词(双指针 + 字符串,中等) 教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载导读本篇文章来自 AlgoNote「算法通关手册」的 LeetCode 题解系列围绕力扣第 0151 题「反转字符串中的单词」展开。该题以字符串为操作对象综合考察对空格处理、单词切分、序列反转与拼接的理解是练习「双指针」与「字符串」技巧的经典中等题。读完本文你将掌握两种可落地的 Python 解法调用库函数版与手写模拟版理解其时间复杂度与空间复杂度差异并能迁移到「反转字符串中的单词 II0186」与「反转字符串中的单词 III0557」等同类题目中。题目链接与基本信息题目0151. 反转字符串中的单词 - 力扣标签双指针、字符串难度中等题解文档docs/solutions/0100-0199/reverse-words-in-a-string.md该题同时被收录于 AlgoNote 的「字符串基础题目列表」与「面试 100 题列表」中属于字符串基础与双指针方向的重点练习题目。题目大意与说明描述给定一个字符串s。要求反转字符串中所有单词的顺序。说明单词由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中单词间应当仅用单个空格分隔且不包含任何额外的空格。$1 \le s.length \le 10^4$。s包含英文大小写字母、数字和空格 。s中至少存在一个单词。示例示例 1输入s hello world 输出world hello 解释反转后的字符串中不能存在前导空格和尾随空格。示例 2输入s a good example 输出example good a 解释如果两个单词间有多余的空格反转后的字符串需要将单词间的空格减少到仅有一个。解题思路思路 1调用库函数直接调用 Python 的库函数对字符串进行切片翻转然后拼合成字符串。核心是str.split()与str.join()的组合split()在无参数调用时会以任意连续的空白字符空格、制表符等作为分隔符切分字符串并自动丢弃结果中的空串因此可以一次性解决前导空格、尾随空格与单词间多余空格的问题。思路 1代码class Solution: def reverseWords(self, s: str) - str: return .join(reversed(s.split()))代码解读s.split()按连续空白切分得到单词列表[hello, world]前导与尾随空格产生的空串不会进入列表reversed(...)对单词列表逆序迭代等价于先split()再整体反转 .join(...)以单个空格为分隔符把逆序后的单词拼回字符串。思路 1复杂度分析时间复杂度$O(n)$其中 $n$ 是字符串s的长度。切分、逆序、拼接三个阶段均只需线性扫描。空间复杂度$O(1)$。该复杂度分析基于 Python 库函数实现如 CPython 中str.split()通过内部偏移量切片生成视图配合reversed()的惰性迭代可近似视为常数级额外空间若按严格理论模型将split()结果列表计入则为 $O(n)$具体取决于评测环境对库函数空间的统计口径。思路 2模拟第二种思路根据 API 的实现逻辑手写模拟不依赖库函数对空白处理的封装便于理解底层机制。具体步骤如下使用数组words存放单词使用字符串变量cur存放当前单词。遍历字符串对于当前字符ch如果遇到空格如果当前单词不为空则将当前单词存入数组words中并将当前单词置为空串cur 如果遇到字符将其存入当前单词中即cur ch。遍历结束后如果当前单词不为空则将当前单词存入数组words中处理末尾单词避免因缺少结尾空格而漏掉。然后对数组words进行翻转操作令words[i]与words[len(words) - 1 - i]交换元素即双指针向中间靠拢的经典交换写法。最后将words中的单词连接起来中间拼接上空格作为答案返回。思路 2代码class Solution: def reverseWords(self, s: str) - str: words [] cur for ch in s: if ch : if cur: words.append(cur) cur else: cur ch if cur: words.append(cur) for i in range(len(words) // 2): words[i], words[len(words) - 1 - i] words[len(words) - 1 - i], words[i] return .join(words)代码解读单词收集阶段顺序遍历s以空格为分隔边界用cur累积非空格字符连续多个空格会因cur为空而不产生空串从而同时去除多余空格与前导/尾随空格收尾处理循环结束后若cur非空说明最后一个单词之后没有空格需手动追加双指针反转阶段for i in range(len(words) // 2)让左右指针从两端向中间交换仅需遍历半个列表长度即可完成逆序拼接返回 .join(words)保证单词间只有一个空格。思路 2复杂度分析时间复杂度$O(n)$其中 $n$ 是字符串s的长度。一次线性扫描收集单词一次双指针交换一次拼接均为线性操作。空间复杂度$O(1)$按原文档口径未将words列表计入。若计入单词列表的存储则为 $O(m)$其中 $m$ 为单词总长度。原地解法可参考下文「同类题目扩展」中的 0186 题。同类题目扩展同一题型的三种变体AlgoNote 题解库中还有两道与本题同源、可通过相同思路迁移解决的题目0186. 反转字符串中的单词 II中等双指针、字符串给定字符数组s要求原地反转单词顺序。解法采用「两次反转」策略先整体反转整个数组再逐个反转每个单词通过双指针left、right标记单词边界遇到空格或到达末尾时反转当前单词区间。时间复杂度 $O(n)$、空间复杂度 $O(1)$是本题「不借助额外空间」场景下的进阶版本。0557. 反转字符串中的单词 III简单双指针、字符串给定字符串s要求反转每个单词内部的字符顺序但保持单词顺序与空格不变。由于 Python 字符串不可变解法基于切片 .join(word[::-1] for word in s.split( ))先按空格切分、逐个逆序、再拼接。时间复杂度 $O(n)$、空间复杂度 $O(n)$。LCR 181. 字符串中的单词反转简单双指针、字符串与本题几乎一致允许前导、尾随及单词间多余空格翻转后仅保留单个空格直接复用 .join(reversed(s.split()))一行代码即可通过。三道题放在一起对比可以看出0151 考「单词顺序反转 空格清理」0186 考「原地实现的两次反转」0557 考「单词内部字符反转」。掌握 0151 的双指针与切分拼接思想即可顺带打通整个「反转字符串中的单词」题族。相关基础与延伸阅读字符串的存储结构顺序存储、链式存储与 Pythonstr不可变特性见 04_01_string_basic.md字符串基础练习题目含 0125 验证回文串、0344 反转字符串、0557 反转字符串中的单词 III见该章末尾的「练习题目」一节算法复杂度分析方法大 O 记号、时间/空间复杂度权衡见 00_03_algorithm_complexity.mdLeetCode 刷题方法与题解使用指南见 00_04_leetcode_guide.md更多字符串方向的 LeetCode 题解可查阅 04_string/index.md 与 0100-0199 题解索引。小结「0151. 反转字符串中的单词」是一道典型的「双指针 字符串」综合题一方面考察split()/join()等内置 API 的熟练运用另一方面考察通过双指针完成序列反转的手写能力。本文给出的两种解法均能在 $O(n)$ 时间内解决问题库函数版代码最简洁、可读性最高适合快速 AC模拟版不依赖 API 的空白处理细节适合理解切分、去空格、反转、拼接的完整流程也便于迁移到不提供split的语言或必须原地操作的场景如 0186。建议结合 AlgoNote 题库中的同族题目0186、0557、LCR 181进行对比练习加深对「字符串不可变」「原地反转」「空格归一化」三个核心要点的掌握。赞分享教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载相关推荐Perfetto 电源数据源完全指南电池计数器Battery Counters与 ODPM 电源轨采集Perfetto 电源数据源完全指南电池计数器Battery Counters与 ODPM 电源轨采集 导读 本文是 Perfetto 追踪框架中 电源教程文档知识库AlgoNote 算法通关手册LeetCode 0009 回文数——不转字符串的整数反转判定法AlgoNote 算法通关手册LeetCode 0009 回文数——不转字符串的整数反转判定法 导读 本篇是「算法通关手册」AlgoNote中 LeetC教程文档知识库AlgoNote 算法通关手册Horspool 字符串匹配算法详解坏字符规则简化版AlgoNote 算法通关手册Horspool 字符串匹配算法详解坏字符规则简化版 Horspool 算法是 Nigel Horspool 于 1980教程文档知识库上一篇Gemini Enterprise 演示系统 7 大结构化 Demo Prompt 设计指南从架构编排到话术约束的完整实战规范下一篇Adobe-GenP 3.0三步免费解锁Adobe全家桶的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表