leetcode 211. 添加与搜索单词 - 数据结构设计 字典树+dfs

本文介绍了一个名为WordDictionary的数据结构设计,支持addWord添加单词和search搜索单词功能,其中search支持使用正则表达式的点字符匹配任意单个字母。通过递归深度优先搜索实现了模式匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计一个支持以下两种操作的数据结构:
void addWord(word)
bool search(word)
search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。
示例:
addWord(“bad”)
addWord(“dad”)
addWord(“mad”)
search(“pad”) -> false
search(“bad”) -> true
search(“.ad”) -> true
search(“b..”) -> true
说明:
你可以假设所有单词都是由小写字母 a-z 组成的。

class WordDictionary {
    /** Initialize your data structure here. */
        boolean flag; //记录串标志
        WordDictionary[] next;
        public WordDictionary() {
            flag=false;
            next=new WordDictionary[26];
        }

        /** Adds a word into the data structure. */
        public void addWord(String word) {
            WordDictionary cur=this;
            for(char ch:word.toCharArray()){
                if(cur.next[ch-'a']==null){
                    cur.next[ch-'a']=new WordDictionary();
                }
                cur=cur.next[ch-'a'];
            }
            cur.flag=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 dfs(this,word);
        }

        public boolean dfs(WordDictionary root,String word){
            WordDictionary cur=root;
            for(int i=0;i<word.length();++i){
                char ch=word.charAt(i);
                if(ch!='.'){
                    if(cur.next[ch-'a']==null){
                        return false;
                    }
                    cur=cur.next[ch-'a'];
                }else{  //如果为. 对每一个节点都进行一次dfs
                    for(int j=0;j<26;++j){
                        if(cur.next[j]!=null){
                            String s=(char)('a'+j)+"";
                            if(dfs(cur,s+word.substring(i+1))){
                                return true;
                            }
                        }
                    }
                    return false;
                }
            }
            return cur.flag;
        }
}

/**
 * Your WordDictionary object will be instantiated and called as such:
 * WordDictionary obj = new WordDictionary();
 * obj.addWord(word);
 * boolean param_2 = obj.search(word);
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值