LeetCode 题解 | 720. Longest Word in Dictionary(字典树 trie树 C++)

题目描述(简单难度)

原题链接
LeetCode 题解 | 720. Longest Word in Dictionary(字典树 trie树 C++)_第1张图片

C++代码1

class Trie {
private:
    //每个Trie节点有一个isEnd变量, 一个包含26个指针的next数组
    Trie *next[26] = {nullptr};
    bool isEnd = false;

public:
    Trie() {
    }

    void insert(const string &word) { // 插入单词
        Trie *root = this;
        for (const auto &ch : word) {
            char w = ch - 'a';
            if (root->next[w] == nullptr) root->next[w] = new Trie();
            root = root->next[w];
        }
        root->isEnd = true;
    }

    bool search(const string &word) { // 查找单词
        Trie *root = this;
        for (const auto &ch : word) {
            char w = ch - 'a';
            if (root->next[w] == nullptr) return false;
            root = root->next[w];
        }
        return root->isEnd;
    }
};


class Solution {
public:
    string Max(string str1, string str2) {
        int n1 = str1.size(), n2 = str2.size();
        if (n1 > n2) return str1;
        else if (n1 < n2) return str2;
        else return min(str1, str2);
    }
    
    string longestWord(vector<string>& words) {
        // 1.把每个单词加入到trie树中
        // 2.遍历每个单词,只有当这个单词的每个字符的isEnd都是true时,才去统计res
        Trie trie;
        for (auto word : words) trie.insert(word);
        
        string res = "";
        for (auto word : words) {
            int i;
            for (i = 0; i < word.size(); i ++) {
                if (trie.search(word.substr(0, i + 1))) continue;
                else break;
            }
            if (i == word.size()) {
                res = Max(res, word);
            }
        }
        
        return res;
    }
};

LeetCode 题解 | 720. Longest Word in Dictionary(字典树 trie树 C++)_第2张图片

C++代码2

class Trie {
public:
    //每个Trie节点有一个isEnd变量, 一个包含26个指针的next数组
    bool isEnd;
    vector<Trie*> next;
    Trie() : isEnd(false), next(26) {
    }

    void insert(const string &word) { // 插入单词
        Trie *root = this;
        for (const auto &ch : word) {
            char w = ch - 'a';
            if (root->next[w] == nullptr) root->next[w] = new Trie();
            root = root->next[w];
        }
        root->isEnd = true;
    }

    bool search(const string &word) { // 查找单词
        Trie *root = this;
        for (const auto &ch : word) {
            char w = ch - 'a';
            // 直接判断每个字符是否是前缀
            if (root->next[w]->isEnd == false ) return false;
            root = root->next[w];
        }
        return root->isEnd;
    }
};


class Solution {
public:
    string Max(string str1, string str2) {
        int n1 = str1.size(), n2 = str2.size();
        if (n1 > n2) return str1;
        else if (n1 < n2) return str2;
        else return min(str1, str2);
    }
    
    string longestWord(vector<string>& words) {
        // 1.把每个单词加入到trie树中
        // 2.遍历每个单词,而此时检索一定不会出现空指针,修改search函数,去判断isEnd即可
        Trie trie;
        for (auto word : words) trie.insert(word);
        
        string res = "";
        for (auto word : words) {
            if (trie.search(word)) res = Max(res, word);
        }
        
        return res;
    }
};

LeetCode 题解 | 720. Longest Word in Dictionary(字典树 trie树 C++)_第3张图片


写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)

你可能感兴趣的:(LeetCode)