ARTICLE DETAIL

资讯详情

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

LeetCode-Go 题解:524. Longest Word in Dictionary through Deleting(双指针 + 字典序贪心)

LeetCode-Go 题解:524. Longest Word in Dictionary through Deleting(双指针 + 字典序贪心) LeetCode-Go 题解524. Longest Word in Dictionary through Deleting双指针 字典序贪心【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go本文以 LeetCode-Go 仓库中 0524 题解文档 为骨架结合仓库内的 Go 实现与测试用例完整拆解 LeetCode 524 题「通过删除字符寻找字典中的最长单词」的暴力双指针解法。读完本文你将掌握如何用双指针判断子序列、如何在等长候选词中选出字典序最小解并能在 O(n·m) 复杂度内完成该题的 Go 实现与自测。题目描述给定一个字符串s和一个字符串字典d要求在字典中找出一个最长的字符串使得该字符串可以通过删除s中的某些字符得到即该字符串是s的一个子序列。如果存在多个长度相同的最长结果返回其中字典序最小的那个如果没有可行结果返回空字符串。示例 1Input: s abpcplea, d [ale,apple,monkey,plea] Output: apple示例 2Input: s abpcplea, d [a,b,c] Output: a注意题目约束输入中的所有字符串仅包含小写字母字典d的大小不超过 1,000输入中所有字符串的长度不超过 1,000。题目大意给出一个初始串s再给定一个字符串数组d要求在d中找到能通过在s中删除字符得到的最长串。若最长串存在多组解则输出字典序最小的那一组若无解则输出空字符串。解题思路这道题的核心在于两点判断某个候选词是否为s的子序列以及在多个可行候选词之间按先长度后字典序的规则选优。从源码结构看仓库给出的参考解法见 实现文件采用的就是单纯的 O(n²) 暴力循环对字典中的每个单词用双指针与s逐字符比对比对通过后再与当前最优解比较最终留下满足条件的最优串。源码实现与逐行解读仓库中的 Go 实现如下完整代码见 524. Longest Word in Dictionary through Deleting.gofunc findLongestWord(s string, d []string) string { res : for i : 0; i len(d); i { pointS : 0 pointD : 0 for pointS len(s) pointD len(d[i]) { if s[pointS] d[i][pointD] { pointD } pointS } if pointD len(d[i]) (len(res) len(d[i]) || (len(res) len(d[i]) res d[i])) { res d[i] } } return res }双指针子序列判定对字典中的每个单词d[i]定义两个指针pointS指向s的当前扫描位置每次循环必然前进一位pointD指向d[i]的当前匹配位置仅当s[pointS] d[i][pointD]时前进一位。内层循环结束后若pointD len(d[i])说明d[i]的所有字符都已按顺序在s中被匹配到即d[i]是s的一个子序列可以通过删除s中的部分字符得到。这段逻辑对应题目描述中 can be formed by deleting some characters of the given string 的核心判定删除字符的本质就是保留子序列双指针恰好以线性代价完成了这一判定避免了逐个枚举删除方案的组合爆炸。最优解的更新规则外层循环末尾的更新条件同时处理了最长与字典序最小两个维度pointD len(d[i]) (len(res) len(d[i]) || (len(res) len(d[i]) res d[i]))第一个条件pointD len(d[i])保证候选词可行len(res) len(d[i])候选词更长直接替换len(res) len(d[i]) res d[i]长度相同但候选词字典序更小Go 中字符串的运算符按字节序比较字典序小写字母场景下与字典序一致替换。初始化res 也天然覆盖了无解时返回空字符串的情况若没有任何候选词通过子序列判定res保持为空串返回。测试用例验证仓库为该实现提供了覆盖多组场景的测试见 524. Longest Word in Dictionary through Deleting_test.go其中既包含题目给出的两个官方示例也补充了更考验判定逻辑的边界用例输入s字典d期望输出验证点abpcplea[ale,apple,monkey,plea]apple官方示例 1选最长可行词abpcplea[a,b,c]a官方示例 2全部可行时取字典序最小abpcplea[aaaaa,b,c]baaaaa不可行非子序列退化为在可行词中选字典序最小bab[ba,ab,a,b]ab两个等长可行词验证字典序比较aewfafwafjlwajflwajflwafj[apple,ewaf,awefawfwaf,awef,awefe,ewafeffewafewf]ewaf长串 多候选词的综合场景以第 4 组为例s bab中ba与ab均为可行子序列且长度相同均为 2此时res ab的比较将结果更新为字典序更小的ab而a、b虽可行但长度更短不会被选中。该用例直观印证了更新条件的正确性。运行测试的推荐方式与仓库 gotest.sh 采用的覆盖方式一致go test -v ./leetcode/0524.Longest-Word-in-Dictionary-through-Deleting/也可按仓库整体测试脚本 gotest.sh 执行全量覆盖测试该脚本会生成单一合法的覆盖率文件coverage.txt。复杂度分析时间复杂度O(n·m)其中 n 为s的长度m 为字典中所有单词的总长度最坏情况下每个单词都与s完整比对一遍字典大小与单词长度上限由题目约束分别给出 1,000因此最坏约 10⁶ 量级的字符比较在约束范围内可以接受空间复杂度O(1)除返回值外仅使用了两个整型指针未引入额外数据结构。延伸思考能否降低复杂度当字典较大时可先对d按长度降序、字典序升序排序再按序返回第一个可行词从而在最优情况下提前终止但排序本身引入 O(k·log k) 的开销k 为字典大小且需注意题解要求如果存在多个最长结果返回字典序最小排序策略与暴力更新在结果上等价。与子序列类题目的关系本解法中的双指针匹配是字符串子序列判定如判断t是否为s的子序列的通用模式可在其他涉及子序列的 LeetCode 题目中复用。Go 字符串比较的细节res d[i]依赖 Go 字符串的按字节字典序比较语义。题目约束输入仅含小写字母因此字节序与字典序完全一致无需额外处理大小写归一化。小结LeetCode 524 题是子序列判定 多目标排序的经典组合题。LeetCode-Go 仓库给出的参考实现以双指针完成子序列判定用一次遍历同时维护最长和字典序最小两个条件代码简洁且覆盖了题目要求的全部边界。结合仓库内配套的测试用例你可以直接运行验证并在此基础上尝试排序优化等变体方案。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表