You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:09:26