(Trie树/暴力加剪枝)leetcode 720 - Longest Word in Dictionary

 

思路:Brute force + pruning

用不用set来存储输入的words都可以。

class Solution {
public:
    string longestWord(vector<string>& words) {
        string best;  //存储当前最优解
        //unordered_set<string> dict(words.begin(), words.end());
        for(const string& word: words){
            //pruning
            if(word.length()<best.length() || (word.length()==best.length()&& word>best))
                continue;
            string prefix;
            bool valid = true;
            for(int i=0; i<word.length()-1 && valid; ++i){
                prefix += word[i];
                if(find(words.begin(), words.end(), prefix)==words.end())
                //if(!dict.count(prefix))
                    valid = false;
            }
            if(valid) best = word;
        }
        return best;
    }
};

2)找不到某个前缀 ,加上break 改进一下。

class Solution {
public:
    string longestWord(vector<string>& words) {
        string best;  //存储当前最优解
        //unordered_set<string> dict(words.begin(), words.end());
        for(const string& word: words){
            //pruning
            if(word.length()<best.length() || (word.length()==best.length()&& word>best))
                continue;
            string prefix;
            bool valid = true;
            
            for(int i=0; i<word.length()-1 && valid; ++i){
                prefix += word[i];
                if(find(words.begin(), words.end(), prefix)==words.end()){
                    //当前单词的前缀在words中找不到
                    valid = false;
                    break;
                }
            }
            
            if(valid) best = word;
        }
        return best;
    }
};

 

解法二:Trie树 加 剪枝:

class Solution {
public:
    struct TrieNode{
        TrieNode* child[26];
        bool is_word;
        TrieNode(): is_word(false){
            for(auto& a:child)
                a = nullptr;
        }
        ~TrieNode(){
            delete[] child;
        }
    };
    struct Trie{
        TrieNode* root = new TrieNode();
        void insert(string word){
            TrieNode* p = root;
            for(char a: word){
                int i = a-'a';
                if(!p->child[i])
                    p->child[i] = new TrieNode();
                p = p->child[i];
            }
            p->is_word = true;
        }
        
        bool hasAllpre(string& word){
            TrieNode* p = root;
            for(char c: word){
                if(!p->child[c-'a'])
                    return false;
                p = p->child[c-'a'];
                if(!p->is_word)
                    return false;
            }
            return true;  
        }
    };

    string longestWord(vector<string>& words) {
        Trie trie;
        for(const string& word: words){
            trie.insert(word);
        }
        string best;
        for(string& word: words){
            if(word.length()<best.length() || (word.length()==best.length() && word>best))
                continue;
            if(trie.hasAllpre(word))
                best = word;
        }
        return best;
    }
};

 

posted @ 2019-07-08 10:34  爱学英语的程序媛  阅读(359)  评论(0编辑  收藏  举报