LeetCode 720 词典中最长的单词[排序 set 字典树] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 720 词典中最长的单词[排序 set 字典树] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。


解题思路:
一道并不简单的简单题,最简单的方法哈希集合的方法,首先将所有字符串按照长度由短到长排序,长度相同按照字典序排序,然后按照排序好的顺序进行遍历,如果当前字符串去掉最后一个字母在unordered_set中,则放入unordered_set,并记录最长字符串,代码如下:

class Solution 
public:
    string longestWord(vector<string>& words) 
        sort(words.begin(), words.end(), [](const string& a, const string& b)
            if(a.size() != b.size()) 
                return a.size() < b.size();
             else return a > b;
        );
        string longest;
        unordered_set<string> search;
        search.insert("");
        for(auto& word : words) 
            if(search.count(word.substr(0, word.size() - 1))) 
                search.insert(word);
                longest = word;
            
        
        return longest;
    
;

如果通晓字典树,那么这道题做起来也是易如反掌,首先构建好字典树,接着把所有字符串放入树中,注意在search的时候,一定每一层都有end的子序列,否则不满足其他单词逐步添加一个字母的条件,代码如下:

class Tree 
private:
    vector<Tree*> children;
    bool isEnd;
public:
    Tree() 
        children = vector<Tree*>(26, nullptr);
        isEnd = false;
    

    void insert(const string& word) 
        Tree* node = this;
        for(const auto& ch : word) 
            int index = ch - 'a';
            if(node->children[index] == nullptr) 
                node->children[index] = new Tree();
            
            node = node->children[index];
        
        node->isEnd = true;
    
    
    bool search(const string& word) 
        Tree* node = this;
        for(const auto& ch : word) 
            int index = ch - 'a';
            // 每一层都要有确定的子序列
            if(node->children[index] == nullptr || !node->children[index]->isEnd) 
                return false;
            
            node = node->children[index];
        
        return node != nullptr && node->isEnd;
    

;

class Solution 
public:
    string longestWord(vector<string>& words) 
        Tree tree;
        for(const string& word : words) 
            tree.insert(word);
        
        string longest;
        for(const string& word : words) 
            if(tree.search(word)) 
                if(word.size() > longest.size() || (word.size() == longest.size() && word < longest)) 
                    longest = word;
                
            
        
        return longest;
    
;

以上是关于LeetCode 720 词典中最长的单词[排序 set 字典树] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

leetcode简单720词典中最长的单词

LeetCode 432. 全 O 的数据结构(双向链表+哈希表) / 720. 词典中最长的单词 / 2043. 简易银行系统

720. 词典中最长的单词

720. 词典中最长的单词

720. 词典中最长的单词

算法千题案例每日LeetCode打卡——91.词典中最长的单词