• [LeetCode] 676. Implement Magic Dictionary


    Design a data structure that is initialized with a list of different words. Provided a string, you should determine if you can change exactly one character in this string to match any word in the data structure.

    Implement the MagicDictionary class:

    • MagicDictionary() Initializes the object.
    • void buildDict(String[] dictionary) Sets the data structure with an array of distinct strings dictionary.
    • bool search(String searchWord) Returns true if you can change exactly one character in searchWord to match any string in the data structure, otherwise returns false.

    Example 1:

    Input
    ["MagicDictionary", "buildDict", "search", "search", "search", "search"]
    [[], [["hello", "leetcode"]], ["hello"], ["hhllo"], ["hell"], ["leetcoded"]]
    Output
    [null, null, false, true, false, false]
    
    Explanation
    MagicDictionary magicDictionary = new MagicDictionary();
    magicDictionary.buildDict(["hello", "leetcode"]);
    magicDictionary.search("hello"); // return False
    magicDictionary.search("hhllo"); // We can change the second 'h' to 'e' to match "hello" so we return True
    magicDictionary.search("hell"); // return False
    magicDictionary.search("leetcoded"); // return False

    Constraints:

    • 1 <= dictionary.length <= 100
    • 1 <= dictionary[i].length <= 100
    • dictionary[i] consists of only lower-case English letters.
    • All the strings in dictionary are distinct.
    • 1 <= searchWord.length <= 100
    • searchWord consists of only lower-case English letters.
    • buildDict will be called only once before search.
    • At most 100 calls will be made to search.

    实现一个魔法字典。

    设计一个使用单词列表进行初始化的数据结构,单词列表中的单词 互不相同 。 如果给出一个单词,请判定能否只将这个单词中一个字母换成另一个字母,使得所形成的新单词存在于你构建的字典中。

    实现 MagicDictionary 类:

    MagicDictionary() 初始化对象
    void buildDict(String[] dictionary) 使用字符串数组 dictionary 设定该数据结构,dictionary 中的字符串互不相同
    bool search(String searchWord) 给定一个字符串 searchWord ,判定能否只将字符串中 一个 字母换成另一个字母,使得所形成的新字符串能够与字典中的任一字符串匹配。如果可以,返回 true ;否则,返回 false 。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/implement-magic-dictionary
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题目说了这么多,其实这就是一道字典树的题,唯一的不同是这道题允许匹配的单词有一个字母的修改。这里我们还是需要先创建字典树,然后利用DFS搜索判断。如果对字典树不熟悉,建议先做208题和211题。其他说明可以参见代码注释。

    时间O(26^n) - n is word.length()

    空间O(n) - 递归栈空间

    Java实现

     1 class MagicDictionary {
     2     class Node {
     3         Node[] next = new Node[26];
     4         boolean isEnd;
     5     }
     6 
     7     Node root = new Node();
     8 
     9     /** Initialize your data structure here. */
    10     public MagicDictionary() {
    11 
    12     }
    13 
    14     public void buildDict(String[] dictionary) {
    15         for (String s : dictionary) {
    16             Node cur = root;
    17             for (char c : s.toCharArray()) {
    18                 if (cur.next[c - 'a'] == null) {
    19                     cur.next[c - 'a'] = new Node();
    20                 }
    21                 cur = cur.next[c - 'a'];
    22             }
    23             cur.isEnd = true;
    24         }
    25     }
    26 
    27     public boolean search(String searchWord) {
    28         return dfs(root, searchWord, 0, false);
    29     }
    30 
    31     private boolean dfs(Node cur, String word, int index, boolean used) {
    32         // 如果当前为空,则返回false
    33         if (cur == null) {
    34             return false;
    35         }
    36 
    37         // 退出条件,当搜索到单词的最后
    38         if (index == word.length()) {
    39             return cur.isEnd && used;
    40         }
    41 
    42         // normal case
    43         char c = word.charAt(index);
    44         for (int i = 0; i < 26; i++) {
    45             // 如果flag用过了但是当前字母不同,就continue去下一个分支找
    46             if (used && (c - 'a') != i) {
    47                 continue;
    48             }
    49             // 接着DFS递归看之后的字母
    50             if (dfs(cur.next[i], word, index + 1, used || (c - 'a') != i)) {
    51                 return true;
    52             }
    53         }
    54         return false;
    55     }
    56 }
    57 
    58 /**
    59  * Your MagicDictionary object will be instantiated and called as such:
    60  * MagicDictionary obj = new MagicDictionary();
    61  * obj.buildDict(dictionary);
    62  * boolean param_2 = obj.search(searchWord);
    63  */

    LeetCode 题目总结

  • 相关阅读:
    代理模式
    适配器模式
    策略模式
    原型模式
    内存溢出
    jvm常用参数
    单例模式
    抽象工厂
    工厂方法模式
    选择器代码
  • 原文地址:https://www.cnblogs.com/cnoodle/p/14730724.html
Copyright © 2020-2023  润新知