目录

1. 题目描述

2. 解题分析

2.1 广度优先搜索

2.2 预处理:按单词长度先排序

2.3 哈希表

2.4 字典树

3. 代码实现


1. 题目描述

给出一个字符串数组 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" 
 
提示:
1 <= words.length <= 1000
1 <= words[i].length <= 30
所有输入的字符串 words[i] 都只包含小写字母。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-word-in-dictionary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题分析

题目并不是要求找最长的单词,而是能够通过一个一个字符添加而构建出的单词中的最长者。所以,对于符合题意得某个长度为k的单词a,在字典中一定存在这样一个单词序列:

所以第一感是从每个长度为1的单词开始搜索,看它通过每次追加一个字符(在字典范围内搜索能匹配的单词)的增长方式,能够增长到的最大长度。

2.1 广度优先搜索

似乎可以用广度优先搜索的方法来做。只不过不是从固定的某个根节点开始BFS,而是要以所有长度为1的单词为根节点分别进行搜索。基本算法流程如下:

        if k in range(len(words):

                if len(words[k])==1:

                        以words[k]为根节点进行广度优先搜索找到距离根节点距离最远的单词

                        (如果有多个,取其中序号最小的)

                        比较更新最长单词

但是,这个思路显得有点复杂。广度优先搜索时每次搜索邻节点都几乎是需要遍历字典,而且还可能需要进行多次广度优先搜索。想一想头皮发麻。

2.2 预处理:按单词长度先排序

根据以上分析,符合条件的单词序列一定是按长度1,2,3....生长出来的。因此可以先对字典按长度进行排序。可以用哈希表来存储整个字典,以长度为键值,其value则是字典中所有长度为该键值的单词的列表。

基于这个哈希表再应用广度优先搜索算法(主要是遍历邻节点时效果大大提高)应该就容易实现多了,能够大大降低复杂度。这种进行进行结构化预处理也是常用手段。最常见的数据预处理手段莫过于将数组排序成有序数组后再处理了。

2.3 哈希表

本方法也是将字典按单词长度先排序(这个排序用哈希表存储)。排完序后,按长度升序将可能合法的结果加入到另一个哈希表中。可能合法的单词的判断依据为:

  • 空字符串为合法单词,这个是初始或者边界条件
  • 如果某单词去掉最后一个字母后存在于哈希表中--这个意味着该单词能够由另一个单词通过再尾部增加一个字母而得到,则该单词为合法单词(因为其前面的单词也是以这种方式挑选出来的)

但是当多个单词长度相同并可以由相同的单词生长而来,题目要求选择其中字典序较小的为答案。可以考虑在最初字典排序时将相同长度的单词按照字典序降序排列。这样,在遍历过程中相同长度的合法单词中最后那个被遍历到的在原字典序中恰为最小的,满足题目要求。

如何确定字典序的大小呢?python中直接用sorted()函数就可以对字符串进行排序,将reverse参数设为True就时降序排列了。

2.4 字典树

待补充。

3. 代码实现

以下代码实现的是2.3解的思路。考虑到第2个哈希表只需要存储键,不需要存储值,所以使用python set()来实现。

import time
from typing import List class Solution:def longestWord(self, words: List[str]) -> str:h1 = dict()for k,word in enumerate(words):# print(k,word)if len(word) in h1:h1[len(word)].append(word)else:h1[len(word)] = [word]# print(h1)h2 = set()key = 1ans = ''while key in h1:                # 相同长度按字典序降序排列wlst = sorted(h1[key], reverse=True)# print(key,wlst)            if key == 1:# All words of length 1 are valid wordfor w in wlst:h2.add(w)ans = welse:for w in wlst:if w[:-1] in h2:h2.add(w)ans = w                        key += 1return ans            if __name__ == '__main__':            sln = Solution()words = ["w","wo","wor","worl", "world"]tStart = time.time()        ans = sln.longestWord(words)tElapsed = time.time() - tStart            print('ans={0}, tCost={1:3.2f}(sec)'.format(ans,tElapsed))             words = ["a", "banana", "app", "appl", "ap", "apply", "apple"]tStart = time.time()        ans = sln.longestWord(words)tElapsed = time.time() - tStart            print('ans={0}, tCost={1:3.2f}(sec)'.format(ans,tElapsed))              words = ["m","mo","moc","moch","mocha","l","la","lat","latt","latte","c","ca","cat"]tStart = time.time()        ans = sln.longestWord(words)tElapsed = time.time() - tStart            print('ans={0}, tCost={1:3.2f}(sec)'.format(ans,tElapsed)) 

回到主目录:笨牛慢耕的Leetcode解题笔记(动态更新。。。)https://chenxiaoyuan.blog.csdn.net/article/details/123040889

Leetcode0720. 词典中最长的单词(simple)相关推荐

  1. 720. 词典中最长的单词

    链接:720. 词典中最长的单词 题解: class Solution { private:struct Trie {int end;std::set<std::string> words ...

  2. 字典树/Trie/前缀树-LeetCode总结:720词典中最长的单词;127. 单词接龙;677. 键值映射;面试题 17.17. 多次搜索;648. 单词替换

    MyTrie结构体和相关操作函数 typedef struct MyTrie {bool is_word;vector<MyTrie*> next;MyTrie():is_word(fal ...

  3. #力扣LeetCode720. 词典中最长的单词 @FDDLC

    题目描述: 720. 词典中最长的单词 - 力扣(LeetCode) (leetcode-cn.com) 自测用例: ["w","wo","wor&q ...

  4. 每日一练 LeetCode:E720. 词典中最长的单词

    题目 给出一个字符串数组 words 组成的一本英语词典.返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成. 若其中有多个可行的答案,则返回答案中字典序最 ...

  5. LeetCode简单题之词典中最长的单词

    题目 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. 若无答案, ...

  6. LeetCode 720. 词典中最长的单词(Trie树)

    1. 题目 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. 若无 ...

  7. 720 词典中最长的单词(Trie树)

    1. 问题描述: 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. ...

  8. 【LeetCode】词典中最长的单词(附集合操作、lamda用法)

    题目描述 给出一个字符串数组 words 组成的一本英语词典.返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成. 若其中有多个可行的答案,则返回答案中字典 ...

  9. LeetCode 720. 词典中最长的单词

    目录结构 1.题目 2.题解 1.题目 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答 ...

  10. 【LeetCode】720. 词典中最长的单词 【前缀树】

    题目链接:https://leetcode-cn.com/problems/longest-word-in-dictionary/ 题目描述 给出一个字符串数组words组成的一本英语词典.从中找出最 ...

最新文章

  1. tensorflow checkpoint文件
  2. python编程爱心-使用Python画出小人发射爱心的代码
  3. leetcode笔记:Gray Code(2016腾讯软件开发笔试题)
  4. 谈谈集群NAS在VDI存储中的应用
  5. django html文本编辑器,django xadmin 集成DjangoUeditor富文本编辑器
  6. 为什么 C++ 中提倡尽量避免使用宏 #define(转)
  7. JavaFX即将推出您附近的Android或iOS设备吗?
  8. 卢松松分享独立博客运营推广经验
  9. spring 的jdbc和事务支持
  10. Java:Spring @Transactional工作原理
  11. java URL和URI
  12. 在线教育平台架构设计-数据库设计1期
  13. [Python]经纬度转换
  14. 如何处理团队的技术债务
  15. 弘辽科技:数字化衍生菜篮子工程,电商巨头纷纷布局
  16. 【怎么卸载影子系统?卸载影子系统解决方法】
  17. matlab 矩阵处理,matlab矩阵处理
  18. Luogu 3642 [APIO 2016] 烟火表演
  19. cordova添加android平台时选择安装版本
  20. CSS设置边框阴影效果

热门文章

  1. 如何使用Keil5开发MSP430及Tiva系列开发板
  2. MyGUI_Orge官网教程_5.窗口部件控制
  3. 力扣刷题 DAY_81 贪心
  4. VSCode前端文件(html文件)以服务器模式在chrome浏览器打开
  5. USB vs PS2_Codeforces
  6. 大学英语计算机统考怎么过,2011年9月大学英语B 统考 计算机网考样题
  7. 自适应页界面HTML源码
  8. android imageview图片崩溃,安卓 ImageView 的使用及崩溃闪退、空白原因
  9. kakfa安装与简单使用
  10. GIF动态表情图如何制作