Add and Search Word - Data structure design

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.

思路:

  前缀树+回溯

我的代码:

public class WordDictionary {



    private TrieNode root;



    public WordDictionary() {

        root = new TrieNode();

    }

    public void addWord(String word) {

        HashMap<Character, TrieNode> children = root.children;

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

        {

            TrieNode node;

            char c = word.charAt(i);

            if(children.containsKey(c)) node = children.get(c);

            else

            {

                node = new TrieNode(c);

                children.put(c,node);

            }

            children = node.children;

            if(i == word.length()-1)

            {

                node.isWord = true;

            }

        }

    }

    public boolean search(String word) {

        if(word==null || word.length()==0)    return true;

        HashMap<Character, TrieNode> children = root.children;

        return helperSearch(word, children);

        

    }

    public boolean helperSearch(String word, HashMap<Character, TrieNode> hash)

    {

        if(word.length() == 1)

        {

            char c = word.charAt(0);

            if(c == '.')

            {

                for(char key : hash.keySet())

                {

                    if(hash.get(key).isWord) return true;

                }

                return false;

            }

            else

            {

                if(hash.containsKey(c))        return hash.get(c).isWord;

                else return false;

            }

        }

        if(word.charAt(0) == '.')

        {

            for(char c: hash.keySet())

            {

                if(helperSearch(word.substring(1), hash.get(c).children))   return true;   

            }

            return false;

        }

        else

        {

            char c = word.charAt(0);

            if(hash.containsKey(c))

            {

                return helperSearch(word.substring(1), hash.get(c).children);

            }

            else return false;

        }

    }

    class TrieNode {

        public TrieNode() {

        }

        public TrieNode(char c) {

            this.c = c;

        }

        char c;

        HashMap<Character, TrieNode> children = new HashMap<Character, TrieNode>();  

        boolean isWord;

    }

}
View Code

学习之处:

  • 之前做了前缀树的解法,很自然的考虑到了回溯的解法,一遍AC了

你可能感兴趣的:(search)