• [leetcode]211. Add and Search Word


    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.

    题意:

    设计一个数据结构,能够插入单词,能够查找字符串,并支持正则表达式中的“.”单字符通配。

    思路:

    这是一道很典型的字典树(Trie)的题目,唯一的变化是在字典树查找的过程中引入了通配符.,通配符匹配可以通过回溯法(枚举26个英文)实现。

    字典树(Trie)是面试中常见的题型,也叫做前缀树,是一种用来快速检索的多叉树结构。对于本题而言,需要构造的是一个英文字母字典树,因此是一个26叉树。

    字典树可以利用字符串的公共前缀来节约存储的空间并加快检索的速度。下图中的字典树包含了五个英文单词dad, do, dog, done, bi:

    字典树有如下基本性质:

    1. 字典树的根节点不包含字符,代表一个空字符串;
    2. 从根节点到某节点,路径上经过的字符连接起来即为该节点所代表的字符串;
    3. 每个节点所代表的字符串各不相同,父节点代表的字符串一定是它孩子节点代表的字符串的前缀

    代码:

     1 class WordDictionary {
     2     
     3     private TrieNode root;
     4     
     5     /** Initialize your data structure here. */
     6     public WordDictionary() {
     7         root = new TrieNode();
     8     }
     9     
    10     /** Adds a word into the data structure. */
    11     public void addWord(String word) { // bad
    12         TrieNode node = root; // 初始化node
    13         for(int i = 0; i< word.length();i++){ // 遍历bad的每个char
    14             int j = word.charAt(i)-'a'; //  j = 62-61 = 1
    15             if(node.children[j]==null){ // 
    16                 node.children[j]=new TrieNode();
    17             }
    18             node = node.children[j];
    19         }
    20         node.isWord = true;
    21         node.word = word;   
    22     }
    23     
    24     /** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
    25     public boolean search(String word) {
    26         return find(word,root,0);
    27     }
    28     
    29     // recursively checking each char 
    30     public boolean find(String word, TrieNode node, int index){
    31         if(index == word.length()) return node.isWord;
    32         if(word.charAt(index) =='.') {
    33             for(TrieNode temp : node.children){
    34                 if(temp!=null && find(word,temp,index+1)) return true;
    35             }
    36             return false;
    37         } else{
    38             int j = word.charAt(index) - 'a';
    39             TrieNode temp = node.children[j];
    40             return temp !=null && find(word, temp, index+1);
    41         }
    42     }
    43 }
    44 
    45 
    46 class TrieNode{
    47     TrieNode[] children;
    48     boolean isWord;
    49     String word;
    50     
    51     public TrieNode(){
    52         children = new TrieNode[26];
    53         isWord = false;
    54         word = "";
    55     }
    56 }
  • 相关阅读:
    centos8.2安装Rabbitmq-3.8.12
    绝对好文C#调用C++DLL传递结构体数组的终极解决方案
    c++到c#数据类型的转换
    WPF中timer的使用
    接收Dialog的值
    WPF子界面向父界面传递带参数的委托
    2015上海居住证和积分办理流程
    Discuz! X3.2重置管理员账号
    winServer2008下安装SqlServer2008数据库
    jodd cache实现缓存超时
  • 原文地址:https://www.cnblogs.com/liuliu5151/p/9810195.html
Copyright © 2020-2023  润新知