资讯详情

资讯详情

LeetCode-Go 题解:1704. Determine if String Halves Are Alike(字符串前半后元音计数对比)

LeetCode-Go 题解1704. Determine if String Halves Are Alike字符串前半后元音计数对比【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go本篇文章围绕 LeetCode 第 1704 题 Determine if String Halves Are Alike 展开讲解如何判断一个偶数长度字符串的前后两半是否包含相同数量的元音字母。文中以 LeetCode-Go 仓库中该题的 README 文档 为主体结合 源码实现 与 单元测试逐层拆解题意、思路、代码与验证方式。读完本文你将掌握这类字符串等分 按字符分类计数题目的标准解法并能在本地运行测试复现结果。一、题目理解题目原文定义如下给定一个偶数长度的字符串s将其拆分为长度相等的两半前半部分记为a后半部分记为b。若a与b包含相同数量的元音字母则称二者alike相似函数返回true否则返回false。需要特别注意的是本题中的元音字母集合同时包含大小写形式a, e, i, o, u, A, E, I, O, U字符串s可能同时包含大写与小写字母因此计数时必须对每个字符做大小写无关的分类判断。约束条件2 s.length 1000s.length为偶数保证可以精确等分为两半s仅由大小写英文字母组成由于字符串长度上限为 1000任何 O(n) 级别的扫描方案都绰绰有余本题属于典型的入门级字符串模拟题。二、题目示例分析原文档给出了四个覆盖不同场景的示例逐个拆解如下示例 1Input: s book Output: true Explanation: a bo and b ok. a has 1 vowel and b has 1 vowel. Therefore, they are alike.book拆成bo与ok前半有 1 个元音o后半有 1 个元音o数量相等返回true。示例 2Input: s textbook Output: false Explanation: a text and b book. a has 1 vowel whereas b has 2. Therefore, they are not alike. Notice that the vowel o is counted twice.textbook拆成text与book前半有 1 个元音e后半有 2 个元音两个o。注意o出现了两次需要重复计数前半 1 个、后半 2 个不相等返回false。示例 3Input: s MerryChristmas Output: falseMerryChristmas前半Merry有 2 个元音e、大写M不是元音y不是元音所以是e和y——注意y不属于题目定义的元音集合实际上前半Merry中只有e是元音后半Christmas中有i和a两个元音数量不等返回false。示例 4Input: s AbCdEfGh Output: true前半AbCd有 1 个元音A后半EfGh有 1 个元音E数量相等返回true。该示例重点验证了大小写字母混排时计数逻辑的正确性。从这四个示例可以看出题目考察的核心是三点正确等分字符串、严格按给定元音集合计数含大小写、以及元音重复出现的多重计数。三、解题思路原文档给出的解题思路非常直接依题意分别统计前半段元音字母的个数与后半段元音字母的个数个数相同则输出true不同则输出false。该思路对应的时间复杂度为 O(n)n为字符串长度空间复杂度为 O(1)因为只需要一个整数计数器不依赖额外存储结构。实现上可以有两种组织方式两次遍历先对前半s[:n/2]统计元音数再对后半s[n/2:]统计元音数最后比较两个计数。一次遍历用一个计数器前半遇到元音1后半遇到元音-1最终计数器为 0 即表示两侧元音数相等。仓库中的实现采用了第一种方式借助一个可复用的numVowels辅助函数代码可读性更强且numVowels本身是一个通用性良好的工具函数可复用于其他字符串元音统计场景。四、源码实现解析仓库中该题的核心实现位于 1704. Determine if String Halves Are Alike.go完整代码如下package leetcode func halvesAreAlike(s string) bool { return numVowels(s[len(s)/2:]) numVowels(s[:len(s)/2]) } func numVowels(x string) int { res : 0 for _, c : range x { switch c { case a, e, i, o, u, A, E, I, O, U: res } } return res }4.1 入口函数halvesAreAlike先通过len(s)/2求出半长利用 Go 字符串切片语法切出后半s[len(s)/2:]与前半s[:len(s)/2]。分别调用numVowels统计两半的元音数量直接以比较结果作为返回值。该写法充分利用了偶数长度的约束无需处理奇数长度的边界情况。4.2 辅助函数numVowels使用for _, c : range x遍历字符串c为每个 runeGo 中range字符串按 Unicode 码点迭代对纯 ASCII 字母输入与 byte 迭代等价。通过switch语句对 10 个元音字符大小写各 5 个做精确匹配命中则计数器res自增。值得注意的设计细节switch没有default分支非元音字符自然跳过逻辑简洁且避免了冗长的if/else if链。从源码结构看该题实现刻意保持零依赖——没有引入任何第三方库或 structures 包中的自定义数据结构非常适合作为字符串模拟题的入门范本。五、单元测试与验证仓库为每道题都配套了标准表驱动风格的单元测试。本题测试位于 1704. Determine if String Halves Are Alike_test.go其中定义了para1704输入参数与ans1704期望答案两个结构体并依次覆盖了 README 中的全部四个示例输入期望输出覆盖场景booktrue两侧各 1 个元音textbookfalse元音o重复出现需多次计数MerryChristmasfalse混合大小写、数量不等AbCdEfGhtrue大小写混排、两侧各 1 个元音测试主体Test_Problem1704遍历用例表调用halvesAreAlike(p.s)并将输入、输出打印到标准输出方便肉眼核对func Test_Problem1704(t *testing.T) { qs : []question1704{ {para1704{book}, ans1704{true}}, {para1704{textbook}, ans1704{false}}, {para1704{MerryChristmas}, ans1704{false}}, {para1704{AbCdEfGh}, ans1704{true}}, } for _, q : range qs { _, p : q.ans1704, q.para1704 fmt.Printf(【input】:%v 【output】:%v\n, p, halvesAreAlike(p.s)) } }5.1 在本地运行测试该仓库根目录的 go.mod 声明了模块名github.com/halfrost/LeetCode-Go与 Go 1.19 版本要求并分别用replace指令将structures、template、ctl/models、ctl/util指向本地子目录。可以直接在仓库根目录执行以下命令仅针对本题目录跑测试go test -v ./leetcode/1704.Determine-if-String-Halves-Are-Alike/如果希望验证覆盖率可参照仓库根目录 gotest.sh 脚本中的写法对全部leetcode子包统一生成覆盖率文件go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...5.2 覆盖率佐证仓库根目录的 coverage.txt 中记录了本题实现的覆盖率数据例如github.com/halfrost/LeetCode-Go/leetcode/1704.Determine-if-String-Halves-Are-Alike/1704. Determine if String Halves Are Alike.go:3.36,5.2 1 4 github.com/halfrost/LeetCode-Go/leetcode/1704.Determine-if-String-Halves-Are-Alike/1704. Determine if String Halves Are Alike.go:7.30,9.22 2 8 github.com/halfrost/LeetCode-Go/leetcode/1704.Determine-if-String-Halves-Are-Alike/1704. Determine if String Halves Are Alike.go:9.22,10.12 1 34 github.com/halfrost/LeetCode-Go/leetcode/1704.Determine-if-String-Halves-Are-Alike/1704. Determine if String Halves Are Alike.go:11.57,12.9 1 10 github.com/halfrost/LeetCode-Go/leetcode/1704.Determine-if-String-Halves-Are-Alike/1704. Determine if String Halves Are Alike.go:15.2,15.12 1 8从记录中可见halvesAreAlike与numVowels的关键代码行均有实际执行计数即测试用例完整覆盖了切片等分、元音命中、非元音跳过、返回值比较等全部路径与项目100% test coverage的整体要求一致。六、复杂度分析时间复杂度O(n)。halvesAreAlike对字符串做两次切片O(1)随后numVowels各遍历半段总遍历字符数为n故总体为 O(n)。空间复杂度O(1)。除整数计数器res外无额外分配切片操作共享底层数组不产生复制。在n ≤ 1000的约束下该方案时间与空间开销都极为充裕。七、延伸思考本题作为字符串模拟题的代表有以下几点值得在面试或复习中延伸大小写归一化技巧若输入中存在大小写字母也可先通过unicode.ToLower统一为小写再判断从而将switch分支从 10 个缩减为 5 个仓库当前实现选择直接枚举 10 个分支省去了标准库调用性能上更优。一次遍历优化可将两半的计数合并到同一个循环中左指针从 0 向右、右指针从n-1向左同步推进一个计数器前半1、后半-1最终为 0 即相似。该写法将循环次数从 2 × (n/2) 降到 n/2但可读性略逊于当前实现。函数复用numVowels是一个与题目解耦的纯工具函数类似的按字符集合计数模式可以迁移到其他涉及字符分类的题目如统计元音、辅音、数字等中直接复用。八、小结LeetCode 1704 题考察的是最基础的字符串处理能力等分切片、按固定字符集合计数、比较两个数值。仓库中的 完整实现 用 15 行代码干净利落地解决了问题配套的 单元测试 完整覆盖了题目给出的全部示例并将覆盖率记录沉淀在 coverage.txt 中。读者可按本文 5.1 节的命令在本地复现全部结果作为理解仓库每题一解 每题一测组织方式的入门范例。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →