LeetCode 0676.实现一个魔法字典 - 易实现但效率不是那么高的方法

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0676.实现一个魔法字典 - 易实现但效率不是那么高的方法相关的知识,希望对你有一定的参考价值。

【LetMeFly】676.实现一个魔法字典:易实现但效率不是那么高的方法

力扣题目链接:https://leetcode.cn/problems/implement-magic-dictionary/

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

实现 MagicDictionary 类:

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

 

示例:

输入
["MagicDictionary", "buildDict", "search", "search", "search", "search"]
[[], [["hello", "leetcode"]], ["hello"], ["hhllo"], ["hell"], ["leetcoded"]]
输出
[null, null, false, true, false, false]

解释
MagicDictionary magicDictionary = new MagicDictionary();
magicDictionary.buildDict(["hello", "leetcode"]);
magicDictionary.search("hello"); // 返回 False
magicDictionary.search("hhllo"); // 将第二个 'h' 替换为 'e' 可以匹配 "hello" ,所以返回 True
magicDictionary.search("hell"); // 返回 False
magicDictionary.search("leetcoded"); // 返回 False

 

提示:

  • 1 <= dictionary.length <= 100
  • 1 <= dictionary[i].length <= 100
  • dictionary[i] 仅由小写英文字母组成
  • dictionary 中的所有字符串 互不相同
  • 1 <= searchWord.length <= 100
  • searchWord 仅由小写英文字母组成
  • buildDict 仅在 search 之前调用一次
  • 最多调用 100search

方法一:set + 模拟

我们直接尝试修改待匹配字符串的每一个字符,如果修改后与字典中某个字符串相同,就返回yes

bool search(string searchWord) 
    for (char& c : searchWord)   // 准备修改原字符串中的每一个字符
        char originalC = c;  // 先记录下来原来的这个字符
        for (int i = 0; i < 26; i++)   // 从a到z逐个尝试
            c = 'a' + i;  // 修改c
            if (c == originalC)  // 如果这个字符就是原本的字符,相当于没有修改
                continue;
            if (se.count(searchWord))  // 如果把c修改后在原始字典中存在了
                return true;  // 返回true
        
        c = originalC;  // 把c修改为原来的字符,准备尝试修改字符串下一个字符
    
    return false;  // 全部尝试过了还没匹配的字符,就返回false

  • 时间复杂度 O ( n l C ) O(nlC) O(nlC),其中 n n n是原始数组中字符串的个数, l l l是原始数组中字符串的平均长度( n l nl nl其实就是原始字符串中所有字符的个数和), C C C是字符集的大小(也就是 26 26 26个英文字母的 26 26 26
  • 空间复杂度 O ( n l ) O(nl) O(nl)

AC代码

C++

class MagicDictionary 
private:
    unordered_set<string> se;
public:
    MagicDictionary() 

    
    
    void buildDict(vector<string> dictionary) 
        for (string& s : dictionary) 
            se.insert(s);
        
    
    
    bool search(string searchWord) 
        for (char& c : searchWord) 
            char originalC = c;
            for (int i = 0; i < 26; i++) 
                c = 'a' + i;
                if (c == originalC)
                    continue;
                if (se.count(searchWord))
                    return true;
            
            c = originalC;
        
        return false;
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125718347

以上是关于LeetCode 0676.实现一个魔法字典 - 易实现但效率不是那么高的方法的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 676 实现一个魔法字典[枚举] HERODING的LeetCode之路

每日一题676. 实现一个魔法字典

「 每日一练,快乐水题 」676. 实现一个魔法字典

「 每日一练,快乐水题 」676. 实现一个魔法字典

字典的魔法

Leetcode.2171 拿出最少数目的魔法豆