211. Add and Search Word - Data structure design

本文介绍了一种使用字典树(Trie)的数据结构来存储单词,并支持正则表达式查询的方法。通过构建字典树,可以高效地进行单词的存储和查询,特别是当查询中包含正则表达式时。文章详细解释了字典树的构建过程,以及如何通过递归匹配算法来处理正则表达式查询。

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

Description

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.

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.

Problem URL


Solution

设计一个储存数据结构,能够存储单词,并且满足正则表达式的查询单词是否存在的操作。

We implemented a trie tree to solve this problem. The trir node have 26 children and item for leaf node to store the word. In add, we find a path from work’s head to tail to store the characters into our trie tree. A global TrieNode root is needed. Leaf node have word value;

In search, we use a match helper to help determine whether a word or regular expression is in this tree. For match, when it comes to leaf node, determine the leaf node stores something or not(can not use eqaul because regular expression) Then for char is ‘.’, use a for loop to find a valid path, the child should be not null and match rest part of chars. If not ‘.’, just follow to the words order and call match.

Code
class WordDictionary {
    public class TrieNode{
        public TrieNode[] children = new TrieNode[26];
        public String item = "";
    }
    private TrieNode root;
    /** Initialize your data structure here. */
    public WordDictionary() {
        this.root = new TrieNode();
    }
    
    /** Adds a word into the data structure. */
    public void addWord(String word) {
        TrieNode node = this.root;
        for (char c : word.toCharArray()){
            if (node.children[c - 'a'] == null){
                node.children[c - 'a'] = new TrieNode();
            }
            node = node.children[c - 'a'];
        }
        node.item = 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 match(word.toCharArray(), 0, this.root);
    }
    
    private boolean match(char[] chars, int depth, TrieNode node){
        if (depth == chars.length){
            return !node.item.equals("");
        }
        if (chars[depth] == '.'){
            for (int i = 0; i < node.children.length; i++){
                if (node.children[i] != null && match(chars, depth + 1, node.children[i])){
                    return true;
                }
            }
        }
        else{
            return node.children[chars[depth] - 'a'] != null && match(chars, depth + 1, node.children[chars[depth] - 'a']);
        }
        return false;
    }
}

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

Time Complexity: O(n)
Space Complexity: O(n)


Review
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值