
LeetCode-Go 题解精讲151. Reverse Words in a String —— 用strings.Fields一行拆词、双指针翻转优雅实现单词级反转【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go导读本篇围绕 LeetCode 第 151 题「反转字符串中的单词Reverse Words in a String」展开以 LeetCode-Go 仓库中 0151.Reverse-Words-in-a-String 目录的官方题解为骨架深入拆解题目约束、标准解法与 Go 语言实现。读完本文你将掌握如何借助 Go 标准库strings.Fields一次性完成「拆分单词 消除首尾与连续多余空格」再配合双指针原地翻转单词切片、最后用strings.Join重建字符串的完整套路并理解其时间与空间复杂度以及为何这套写法天然满足题目对空格处理的所有要求。题目逐个翻转字符串中的每个单词题目原链接151. Reverse Words in a StringLeetCode 官方题面给定一个输入字符串要求以单词为最小单位将其反转。核心约束如下单词的定义由非空格字符组成的连续序列sequence of non-space characters标点符号如!、.与字母一同构成单词的一部分不做单独处理首尾空格输入字符串可以包含前导leading或尾随trailing空格但反转后的结果不能包含这些多余空格单词间空格如果两个单词之间存在多个连续空格反转后需将单词间的空格缩减为单个空格。示例输入输出说明the sky is blueblue is sky the无多余空格仅需整体倒序 hello world! world! hello去掉首尾空格world!中!属于单词的一部分a good exampleexample good a将单词间多个空格压缩为单个空格进阶要求Follow-up对于选择C 语言的读者题目建议尝试使用O(1) 额外空间复杂度的**原地in-place**解法。Go 语言由于字符串不可变本文给出的标准库解法基于strings.Fields 双指针属于 O(n) 辅助空间的实现若要在 O(1) 额外空间下原地完成可参考 C 语言中「先整体反转字符串、再逐个反转每个单词」的两段式思路下文会做原理对比但仓库内的官方 Go 解法并不采用该路径。解题思路拆词 → 翻转 → 拼接依照题意标准解法分三步走与题目约束一一对应拆分split先把输入字符串按照空格可连续、可在首尾分隔成一个个独立单词——这一步同时天然解决了「压缩多余空格」和「剔除首尾空格」两个问题翻转reverse把单词序列整体前后翻转达到以单词为单位反转的效果拼接join在每个翻转后的单词之间补上单个空格重建最终字符串。整体思路即strings.Fields拆→ 双指针reverse翻→strings.Join拼。仓库文档website/content.en/ChapterFour/0100~0199/0151.Reverse-Words-in-a-String.md中对该思路有明确概述first split the string into individual words by spaces, then reverse the order of the words, and finally add spaces between each word.Go 官方题解拆词 → 翻转 → 拼接仓库在 leetcode/0151.Reverse-Words-in-a-String/151. Reverse Words in a String.go 中给出了如下实现package leetcode import strings func reverseWords151(s string) string { ss : strings.Fields(s) reverse151(ss, 0, len(ss)-1) return strings.Join(ss, ) } func reverse151(m *[]string, i int, j int) { for i j { (*m)[i], (*m)[j] (*m)[j], (*m)[i] i j-- } }逐行拆解strings.Fields(s)Go 标准库函数以空白字符空格、tab、换行等 Unicode 空白为分隔符拆分字符串并自动丢弃所有前导、尾随及连续多余的空格返回单词切片。这一步以极简方式同时满足题目 Note 中的两条硬性约束——reversed string should not contain leading or trailing spaces 与 reduce multiple spaces between two words to a single spacereverse151(ss, 0, len(ss)-1)对单词切片做双指针原地翻转。i指向切片头、j指向切片尾循环交换ss[i]与ss[j]直到两指针相遇i j。通过传切片指针翻转直接作用于底层数组无需额外分配strings.Join(ss, )用单个空格把翻转后的单词连接成最终字符串。关键设计点为什么传入指针*[]stringreverse151的形参是*[]string切片指针。这里需要说明Go 的切片本身就是引用类型若直接传值ss函数内部对元素的修改m[i], m[j] m[j], m[i]同样会反映到调用方——因为元素读写作用于共享的底层数组。而传入指针的写法在语义上更明确地表达了函数会修改这个切片的状态属于显式、防御性的编码风格也是本项目LeetCode-Go题解中常见的写法之一。单测验证三个官方示例全覆盖仓库为本题配备了完整测试文件 leetcode/0151.Reverse-Words-in-a-String/151. Reverse Words in a String_test.go采用本仓库统一的表驱动table-driven 标准testing包组织方式package leetcode import ( fmt testing ) type question151 struct { para151 ans151 } // para 是参数 // one 代表第一个参数 type para151 struct { one string } // ans 是答案 // one 代表第一个答案 type ans151 struct { one string } func Test_Problem151(t *testing.T) { qs : []question151{ { para151{the sky is blue}, ans151{blue is sky the}, }, { para151{ hello world! }, ans151{world! hello}, }, { para151{a good example}, ans151{example good a}, }, } fmt.Printf(------------------------Leetcode Problem 151------------------------\n) for _, q : range qs { _, p : q.ans151, q.para151 fmt.Printf(【input】:%v 【output】:%v\n, p, reverseWords151(p.one)) } fmt.Printf(\n\n\n) }测试覆盖了题目给出的三个标准示例正好对应三种边界情形the sky is blue→blue is sky the常规情况无多余空格 hello world! →world! hello首尾带空格验证结果不含前导/尾随空格a good example→example good a单词间多个空格验证结果只保留单个空格。每个用例均以para151输入参数/ans151期望答案的结构组织再逐条调用reverseWords151(p.one)与期望结果比对。得益于strings.Fields对空白的分隔与清理语义这三个用例无需任何特殊分支即可全部通过。若要在本地运行该测试可在仓库根目录执行仓库 go.mod 声明模块github.com/halfrost/LeetCode-GoGo 版本 1.19go test -v -run Test_Problem151 ./leetcode/0151.Reverse-Words-in-a-String/复杂度与边界分析时间复杂度O(n)strings.Fields(s)需线性扫描字符串一次O(n)双指针reverse151对len(ss)个单词各交换一次O(len(ss)) ≤ O(n)strings.Join同样线性拼接O(n)。总体时间复杂度O(n)其中 n 为输入字符串长度。空间复杂度O(n)strings.Fields会为单词切片分配 O(n) 空间单词总长度不超过原串长度切片本身另需 O(单词数) 开销翻转是原地交换无额外分配strings.Join为结果字符串分配 O(n) 空间。总体空间复杂度O(n)。这与题目对 C 语言用户的 O(1) 原地进阶要求不同——Go 的string不可变标准库解法以 O(n) 空间换取极简实现属于工程上的合理取舍。边界情形覆盖输入说明the sky is blue常规多词输入 hello world! 前导 尾随空格!属于单词world!a good example单词间连续多个空格 纯空格串strings.Fields返回空切片翻转与Join均为空操作最终返回空串同上返回single单单词无空格可拆翻转后原样返回single方案对比标准库 vs 两段式原地翻转题目进阶要求C 语言方向提示了另一条经典路径——两段式原地反转与本文采用的标准库方案形成互补整体反转先把整个字符串反转包括空格使单词顺序倒置局部反转再扫描字符串对每个单词内部做反转恢复其原始字母顺序清理空格最后压缩多余空格并去除首尾空格。该思路可用 O(1) 额外空间完成但实现复杂度明显更高需要自己处理单词边界扫描、空格压缩与滑动覆盖代码量远大于本文的三行核心逻辑。作为对照Go 标准库方案将拆词 去多余空格 去首尾空格这一最易出错的部分全部交给经过充分验证的strings.Fields完成把翻转单词顺序这一唯一的核心逻辑留给业务代码正确性与可读性显著占优。两种方案本质互补追求极简与可读性选标准库方案追求 O(1) 额外空间或需要迁移到 C 等可变字符串语言时两段式原地翻转是标准答案。总结LeetCode 151 是一道典型的字符串 双指针入门题考察重点在于对空格边界条件的处理单词 非空格字符序列标点随单词一起反转首尾空格必须剔除、连续空格必须压缩为单个这两条约束由strings.Fields一次性兜底核心算法 拆词 → 双指针翻转 → 单空格拼接时间复杂度 O(n)。仓库在 leetcode/0151.Reverse-Words-in-a-String 目录中同时提供了 题解实现、表驱动测试 与 题目说明 README对应的英文题解页面位于 website/content.en/ChapterFour/0100~0199/0151.Reverse-Words-in-a-String.md是复习该题与类似字符串处理题如 345. Reverse Vowels、557. Reverse Words in a String III 等的绝佳参考。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考