跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

LeetCode 720. 字典中最长单词(Python 实现)

本题要求从给定字符串数组中找出能由数组内其他单词逐个字符构建的最长单词,若长度相同则返回字典序最小者。核心在于验证单词的所有前缀是否均存在于输入列表中。初始思路采用全量排序后暴力校验前缀存在性,但效率较低。进阶解法利用集合快速查找特性,配合预排序保证字典序,仅保留有效前缀进行状态更新。该方法将时间复杂度大幅优化,运行速度提升显著,是处理此类前缀匹配问题的标准范式。

菩提发布于 2021/5/21更新于 2026/6/1120 浏览
LeetCode 720. 字典中最长单词(Python 实现)

题目描述

给定一个字符串数组 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" 字典序更小。

约束条件:

  • 1 <= words.length <= 1000
  • 1 <= words[i].length <= 30
  • 所有单词仅包含小写英文字母

解题思路

这道题的核心在于验证每个单词的所有前缀是否都存在于给定的集合中。我们可以从两个角度来思考解决方案。

方案一:暴力排序校验

最直观的想法是先对单词列表进行排序,然后逐个检查。为了确保字典序在长度相同时优先被选中,我们先按字典序排序。对于每个单词,我们需要确认它的所有前缀(包括空串)都在原列表中。

这里有个小技巧:我们在处理前先往列表里补一个空字符串 '',这样第一个字符的单词也能通过前缀校验。遍历过程中,如果发现某个前缀不在列表中,当前单词就不符合条件,直接跳过。

虽然逻辑简单,但由于每次都要遍历前缀并查询列表,时间复杂度较高,在处理大规模数据时效率会明显下降。

class Solution(object):
    def longestWord(self, words):
        # 补充空字符串作为基础前缀
        words += ['']
        # 先按字典序排序,保证同长度下取最小字典序
        words.sort()
        
        l = []
         word  words:
            
             i  ((word)):
                tmp = word[:i]
                 tmp   words:
                    
            :
                
                l.append(word)
        
         (l) == :
             
        
        l.sort(key= x: (x), reverse=)
         l[]
for
in
# 检查所有前缀是否存在
for
in
range
len
if
not
in
break
else
# 循环正常结束,说明所有前缀都存在
if
len
0
return
''
# 按长度降序排列,取最长者
lambda
len
True
return
0

方案二:哈希集合优化

高手通常会利用空间换时间的策略。既然我们要频繁判断前缀是否存在,用集合(Set)来存储已验证的有效前缀是更优的选择。

具体做法是:同样先对 words 排序。维护一个集合 s,初始放入空字符串。遍历排序后的单词,如果 word[:-1](即去掉最后一个字符的前缀)在集合中,说明这个单词可以合法构建,将其加入集合,并更新当前记录的最长单词。

这样做的好处是,判断前缀是否存在的时间复杂度降到了 O(1)。而且因为已经排过序,我们只需要比较长度,自然就能满足'长度相同取字典序最小'的要求。

class Solution(object):
    def longestWord(self, words):
        # 排序确保字典序优先
        words.sort()
        s = set([''])
        r = ''
        
        for word in words:
            # 关键判断:前缀是否在有效集合中
            if word[:-1] in s:
                s.add(word)
                # 只有更长才更新,同长度因已排序不会覆盖
                if len(word) > len(r):
                    r = word
        return r

性能对比

两种方法都能得到正确答案,但在实际运行中差异巨大。

  • 方案一:由于嵌套循环和列表查找,耗时约 780ms,速度较慢。
  • 方案二:利用集合快速查找,耗时降至 52ms,性能提升显著。

在实际开发或面试中,推荐直接使用集合优化的方案,代码更简洁且效率更高。

目录

  1. 题目描述
  2. 解题思路
  3. 方案一:暴力排序校验
  4. 方案二:哈希集合优化
  5. 性能对比
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 欧姆龙 Sysmac Studio 编程基础技巧与方法
  • AI 产品经理入门指南:核心能力与转型路径
  • 前端调试:Debugger 断点设置与使用
  • Vivado 项目 Git 版本管理实战指南
  • Android 常用三方库混淆规则整理
  • 12 篇大模型前沿研究论文精选
  • 大模型 SFT 的 100 个关键点:深入剖析与应用指南
  • 开源飞控 Pix 无人机装调与测试指南
  • 前端面试核心知识点整理(含 JavaScript、Vue、React 等)
  • Hive 0.7.1 基于 Ubuntu 的伪分布式环境搭建与配置
  • 企业微信群机器人 Webhook 配置与消息发送流程
  • MCP 协议传输层详解:四种通信方式实现与对比
  • Obsidian 配合 Github 与坚果云实现笔记同步方案
  • C/C++回调函数用法详解
  • 深入理解 LLM Agent:核心概念、架构与发展趋势
  • Git 入门:环境配置、核心概念与文件操作
  • OpenClaw 赋能机器人硬件,AI 代理迈向具身智能新阶段
  • MySQL 索引原理与分类详解
  • 网络爬虫全景:技术体系、反爬对抗与全链路成本分析
  • DeepSeek 降低 AIGC 检测率的 5 条指令与 3 款工具实测

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online