您的位置:首页 > 其它

leetcode--Add and Search Word - Data structure design

2017-08-08 14:17 375 查看
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.

[java] view
plain copy

class TrieNode {  

    // Initialize your data structure here.  

    public TrieNode() {}  

    Map<Character,TrieNode> next = new HashMap<Character,TrieNode>();  

    char c='\0';  

    boolean isEnd = false;  

    public TrieNode(char c) {  

        this.c = c;          

    }  

}  

public class WordDictionary {  

    private TrieNode root;  

  

    public WordDictionary() {  

        root = new TrieNode();  

    }  

      

    // Adds a word into the data structure.  

    public void addWord(String word) {  

        Map<Character, TrieNode> children = root.next;    

        for(int i=0; i<word.length(); i++) {    

            char c = word.charAt(i);    

            TrieNode t;    

            if(children.containsKey(c)) {    

                t = children.get(c);    

            } else {    

                t = new TrieNode(c);    

                children.put(c, t);    

            }    

            children = t.next;    

            if(i==word.length()-1) t.isEnd=true;    

        }    

    }  

  

    // 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 helper(word,root);  

    }  

      

    public boolean helper(String word,TrieNode tn){  

        if(tn==null) return false;    

        if(word.length() == 0 ) return tn.isEnd;    

            

        Map<Character, TrieNode> children = tn.next;    

        TrieNode t = null;    

        char c = word.charAt(0);    

        if(c=='.') {    

            for(char key : children.keySet() ) {    

                if(helper(word.substring(1), children.get(key) )) return true;    

            }    

            return false;    

        } else if(!children.containsKey(c)) {    

            return false;    

        } else {    

            t = children.get(c);    

            return helper(word.substring(1), t);    

        }    

    }  

}  

  

// Your WordDictionary object will be instantiated and called as such:  

// WordDictionary wordDictionary = new WordDictionary();  

// wordDictionary.addWord("word");  

// wordDictionary.search("pattern");

原文链接http://blog.csdn.net/crazy__chen/article/details/46576277
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: