Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >词典中最长的单词

词典中最长的单词

作者头像
羽翰尘
发布于 2020-07-14 03:14:41
发布于 2020-07-14 03:14:41
95900
代码可运行
举报
文章被收录于专栏:技术向技术向
运行总次数:0
代码可运行

leetcode题号:720

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

若无答案,则返回空字符串。

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: 
words = ["w","wo","wor","worl", "world"]
输出: "world"
解释: 
单词"world"可由"w", "wo", "wor","worl"添加一个字母组成。

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: 
words = ["a", "banana", "app", "appl", "ap", "apply", "apple"]
输出: "apple"
解释: 
"apply""apple"都能由词典中的单词组成。但是"apple"得字典序小于"apply"

注意:

  • 所有输入的字符串都只包含小写字母。
  • words数组长度范围为[1,1000]。
  • words[i]的长度范围为[1,30]。

解答一

先将原字符数组按升序排列,然后从左到右遍历。 如果当前单词长度为1,或者能在合法单词哈希表中查到前缀,就加入合法单词哈希表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    string longestWord(vector<string>& words) {
        unordered_map<string, int> myhash;
        sort(words.begin(), words.end());
        string res;
        int max_size = 0;
        for(auto &m : words){
            if(m.size() == 1 || myhash.find(m.substr(0, m.size() - 1)) != myhash.end()){
                myhash.insert(pair<string, int>(m, 0));
                if(m.size() > max_size){
                    res = m;
                    max_size = m.size();
                }
            }
        }
        return res;
    }
};

注意,我认为该题应该明确说明所有单词都只能从长度为1的单词开始加,不然像[“ap”, “app”]的答案应该为”app”, 因为它也是由其他单词添加了一个字母组成的。

注意: 此处用哈希表,或者用字典,其时间复杂度要好于用set。

解答二

使用最长前缀树,该树的具体构造需要再研究。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class TrieNode {
public: 
    bool is_word;
    vector<TrieNode*> children;
    TrieNode() : is_word(false), children(26, nullptr){}
    ~TrieNode(){
        for(TrieNode* child : children) if(child) delete child;
    }
};

class Solution {
public:
    string res_str;
    TrieNode* trie_root;
    string longestWord(vector<string>& words) {
        trie_root = new TrieNode();
        for(auto &word : words) add_word(word);
        string temp_str = "";
        my_find(trie_root, temp_str);
        return res_str;
    }
    void add_word(string &word){
        TrieNode *ptr = trie_root;
        for(auto ch : word){
            if(ptr->children[ch - 'a'] == NULL){
                ptr->children[ch - 'a'] = new TrieNode();
            }
            ptr = ptr->children[ch - 'a'];
        }
        ptr->is_word = true;
    }
    void my_find(TrieNode *root, string &res_word){
        if(root != NULL){
            for(int index = 0; index < 26; index++){
                if(root->children[index] != NULL && root->children[index]->is_word){
                    string new_str = res_word + char('a' + index);
                    if(new_str.size() > res_str.size()) res_str = new_str;
                    my_find(root->children[index], new_str);
                }
            }
        }
    }
    
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 720. 词典中最长的单词(Trie树)
给出一个字符串数组words组成的一本英语词典。从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成。若其中有多个可行的答案,则返回答案中字典序最小的单词。
Michael阿明
2020/07/13
8280
LeetCode 720. 词典中最长的单词(Trie树)
用javascript分类刷leetcode22.字典树(图文视频讲解)
Trie树,即字典树,又称前缀树,是一种树形结构,典型应用是用于统计和排序大量的字符串(但不限于字符串),所以经常被搜索引擎用于文本词频统计。它的优先是,最大限度的减少无谓的字符串比较,提高查找效率。
js2030code
2023/01/04
6240
【算法千题案例】每日LeetCode打卡——91.词典中最长的单词
思路解析 对于每个单词,我们可以检查它的全部前缀是否存在,可以通过 Set 数据结构来加快查找
呆呆敲代码的小Y
2021/12/11
4130
【面试高频题】难度 1/5,可用 Trie 进阶的模拟题
给出一个字符串数组 words 组成的一本英语词典。返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成。
宫水三叶的刷题日记
2022/10/30
2600
通过删除字母匹配到字典里最长单词
给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。
羽翰尘
2020/07/14
9000
【蓝桥杯算法 | 前缀树】
九年义务漏网鲨鱼
2025/07/14
6290
【蓝桥杯算法 | 前缀树】
单词搜索II
给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。
狼啸风云
2023/12/02
3240
单词搜索II
LeetCode 212. 单词搜索 II(Trie树+DFS)
给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。
Michael阿明
2020/07/13
4260
LeetCode 212. 单词搜索 II(Trie树+DFS)
LeetCode 648. 单词替换(Trie树)
在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。
Michael阿明
2020/07/13
6390
LeetCode 648. 单词替换(Trie树)
Google 面试题分析 | 字典里面的最长单词
描述 给定一个字符串列表words,找到words最长的word,使得这个word可用words中的其他word一次一个字符地构建。如果有多个可选答案,则返回最长的且具有最小字典序的word。 样例 Ⅰ. Input: words =["w","wo","wor","worl","world"]     Output: "world"     Explanation: “world”可通过”w”, “wo”, “wor”, “worl”一次一个字符进行构建。 Ⅱ . Input: words =["a",
汤高
2018/01/11
8960
2023-04-17:设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词。实现 WordFilter 类:WordF
2023-04-17:设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词。
福大大架构师每日一题
2023/06/08
4350
2023-04-17:设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词。实现 WordFilter 类:WordF
2023-04-17:设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词。 实现 WordFilter 类: WordFilter(string[]
2023-04-17:设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词。
福大大架构师每日一题
2023/04/17
4340
2023-04-17:设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词。 实现 WordFilter 类: WordFilter(string[]
搞定大厂算法面试之leetcode精讲22.字典树
Trie树,即字典树,又称前缀树,是一种树形结构,典型应用是用于统计和排序大量的字符串(但不限于字符串),所以经常被搜索引擎用于文本词频统计。它的优先是,最大限度的减少无谓的字符串比较,提高查找效率。
全栈潇晨
2021/12/06
4840
LeetCode 211. 添加与搜索单词 - 数据结构设计(Trie树)
void addWord(word) bool search(word) search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。
Michael阿明
2020/07/13
4450
LeetCode 211. 添加与搜索单词 - 数据结构设计(Trie树)
字符串匹配算法(Trie树)
Trie树是一个多叉树;二叉树的数据结构里存放着左右子节点的指针; Trie树采用的一种经典的存储方式是散列表。
Michael阿明
2021/02/20
1.2K0
字符串匹配算法(Trie树)
漫画:什么是“前缀树”?
如上图所示,我们在百度输入框输入ap两个字母,下拉菜单就会自动列举出包含该前缀的所有单词,比如api、app、apple等等。
小灰
2023/09/26
3300
漫画:什么是“前缀树”?
剑指Offer——Trie树(字典树)
Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
全栈程序员站长
2022/10/03
1.1K0
剑指Offer——Trie树(字典树)
算法学习笔记-回溯
一、排列问题 1、leetcode第46题:https://leetcode-cn.com/problems/permutations/ //这就是一个单纯的排列问题,不要求前面的数必须在前面,要求就是每个数只能出现一次:无重复数字 class Solution { private: vector <int> tmp; vector <vector <int>> res; int vis[10] = {0}; public:
买唯送忧
2021/06/15
5220
【图解算法】模板+变式——带你彻底搞懂字典树(Trie树)
接下来将对经典的字典树进行代码实现;接着做几个变体题目深入理解字典树的强大;最后回到日常生活,瞧瞧字典树怎样融入到了我们的生活之中 >_<
全栈程序员站长
2022/10/04
1.5K0
【图解算法】模板+变式——带你彻底搞懂字典树(Trie树)
三分钟基础:什么是 trie 树?
为什么说非典型呢?因为它和一般的多叉树不一样,尤其在结点的数据结构设计上,比如一般的多叉树的结点是这样的:
帅地
2019/12/05
1K0
三分钟基础:什么是 trie 树?
推荐阅读
相关推荐
LeetCode 720. 词典中最长的单词(Trie树)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档