Python实现LeetCode720时代码仅返回列表第二个元素如何修正
问题描述
求解词典中最长的单词题目要求:
给定一个表示英语词典的字符串数组words,返回words中最长的单词,该单词需能够由words中的其他单词逐次添加一个字符构建而成。
若存在多个符合要求的答案,返回字典序最小的最长单词;若不存在符合要求的答案,返回空字符串。示例1:
输入:words = ["w","wo","wor","worl","world"]
输出:"world"
解释:单词"world"可由"w"、"wo"、"wor"、"worl"逐次添加一个字符构造而成。示例2:
输入:words = ["a","banana","app","appl","ap","apply","apple"]
输出:"apple"
解释:"apply"和"apple"都可由词典中的其他单词构造而成,但"apple"的字典序小于"apply"。
现有代码运行异常,仅返回列表第二个元素,代码如下:
class Solution: def longestWord(self, words: List[str]) -> str: words.sort(key=len) def find(m,n): if n==0 and len(words[n])!=1: return Flase if len(words[n])==1: return 1 if words[m]==words[n]+words[m][-1]: result=find(n,n-1) else: n=n-1 result=find(m,n) for i in range(len(words)-1,0,-1): j=i-1 res=find(i,j) if res==1: return words[i] return ''
代码错误排查
现有代码共存在6处核心问题,直接导致逻辑失效、运行报错:
- 拼写错误:布尔值
False被错写为Flase,运行时会直接触发名称错误。 - 递归函数无返回值:
find函数内完成递归计算后,没有返回result变量,函数默认返回None,后续判断res==1的逻辑完全失效。 - 排序规则缺失:仅按单词长度排序,没有处理同长度单词的字典序排序规则,无法满足“同长度返回字典序更小值”的要求。
- 递归边界逻辑漏洞:判断单字符单词时,没有校验该单词是否真的是当前递归路径上的合法前缀,且当n递减到负数时没有终止逻辑,会触发索引越界错误。
- 前缀匹配逻辑错误:判断前缀时仅拼接目标词的最后一个字符和当前对比词做比对,没有校验两个词的长度差是否为1,大量无效比对会导致递归逻辑完全混乱。
- 遍历逻辑缺陷:从长到短遍历单词时,找到第一个符合条件的单词就直接返回,没有校验同长度下是否存在字典序更小的符合条件的单词,返回结果不符合题目要求。
可行修正方案
放弃复杂度高、易出错的递归回溯写法,改用集合存储合法前缀的思路,逻辑清晰且时间复杂度更低,修正后代码如下:
from typing import List class Solution: def longestWord(self, words: List[str]) -> str: # 排序规则:先按长度升序,同长度按字典序升序 words.sort(key=lambda x: (len(x), x)) valid_words = set() res = "" for word in words: # 单字符单词天然合法,或去掉最后一位的前缀已经在合法集合中,则当前单词合法 if len(word) == 1 or word[:-1] in valid_words: valid_words.add(word) # 因为按长度升序遍历,只有更长的合法单词才更新结果,同长度先遍历到的字典序更小,不更新 if len(word) > len(res): res = word return res
代码验证:
- 示例1输入按规则排序后为
["w","wo","wor","worl","world"],遍历后最终返回"world",符合预期。 - 示例2输入按规则排序后为
["a","ap","app","appl","apple","apply","banana"],遍历到"apple"时长度为5更新结果,后续"apply"长度相同不更新,"banana"前缀不在合法集合中不收录,最终返回"apple",符合预期。
内容的提问来源于stack exchange,提问作者Richard Williams
相关产品推荐
相关产品推荐

