leetcode:Add and Search Word - Data structure design

Design a data structure that supports the following two operations:

void addWord(word)
bool search(word)
search(word) can search a literal word or a regular expression string containing only letters a-z or .. A . means it can represent any one letter.

For example:

addWord(“bad”)
addWord(“dad”)
addWord(“mad”)
search(“pad”) -> false
search(“bad”) -> true
search(“.ad”) -> true
search(“b..”) -> true
Note:
You may assume that all words are consist of lowercase letters a-z.

click to show hint.

You should be familiar with how a Trie works. If not, please work on this problem: Implement Trie (Prefix Tree) first.

设计一个数据结构,满足插入和查找的功能,查找要满足”.”代表任意字母的要求
其实就是Trie的变形

public class WordDictionary {

    Trie trie = new Trie();

    // Adds a word into the data structure.
    public void addWord(String word) {
        trie.addWord(word);
    }

    // Returns if the word is in the data structure. A word could
    // contain the dot character '.' to represent any one letter.
    public boolean search(String word) {
        return trie.search(word);
    }

    class TrieNode{
        boolean isEnd;
        TrieNode[] childs;

        public TrieNode(boolean isEnd){
            this.isEnd = isEnd;
            this.childs = new TrieNode[26];
        }
    }
    class Trie {
        TrieNode root;

        public Trie(){
            this.root = new TrieNode(true);
        }

        public void addWord(String word){
            TrieNode node = root;
            for(int i = 0 ; i < word.length(); ++i){
                int index = word.charAt(i) - 'a';
                if(node.childs[index] == null){
                    node.childs[index] = new TrieNode(false);
                }
                node = node.childs[index];
            }
            node.isEnd = true;
        }

        public boolean search(String word){
            return search(word, 0, root);
        }

        public boolean search(String word, int index, TrieNode node){
            if(word.length() == index) return node.isEnd;
            if(word.charAt(index) == '.'){
                for(int i = 0; i < 26; ++i){
                    if(node.childs[i] == null) continue;
                    boolean flag = search(word, index + 1, node.childs[i]);
                    if(flag == true)return true;
                }   
                return false;
            }
            int i = word.charAt(index) - 'a';
            node = node.childs[i];
            return node != null && search(word, index + 1, node);
        }
    }
}

你可能感兴趣的:(leetcode)