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);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值