676. 实现一个魔法字典

魔法字典数据结构设计
本文介绍了一种名为MagicDictionary的特殊数据结构的设计方法。该数据结构能够接收一个互不相同的单词列表作为输入,并支持查询操作,即判断是否可以通过替换查询单词中的一个字符来匹配字典中的任何一个单词。

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

实现 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]

class MagicDictionary {
    String [] res;

    public MagicDictionary() {

    }
    
    public void buildDict(String[] dictionary) {
        res=new String[dictionary.length];
        for(int i=0;i<dictionary.length;i++){
            res[i]=dictionary[i];
        }
    }
    
    public boolean search(String searchWord) {
        for(String s:res){
            if(isSimilar(s,searchWord)){
                return true;
            }
        }
        return false;

    }
    public boolean isSimilar(String s,String target){
        int count=0;
        if(s.length()!=target.length()){
            return false;
        }
       
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)!=target.charAt(i)){
                 count++;
            }
        }
         //必须有一个字符不同 才是魔法字符
        return count==1?true:false;
    }
}

 

<think>我们被要求定义一个包含字典功能的类。在Python中,我们可以通过创建一个类并实现字典的一些核心方法(如`__getitem__`,`__setitem__`,`__delitem__`,`__len__`,`__iter__`等)来模拟字典的行为。另外,我们也可以考虑继承Python内置的`dict`类,这样我们就自动拥有了字典的所有功能,然后我们可以按需重写一些方法或添加新方法。根据用户提供的引用,我们可以看到一些字典的基本操作,比如使用`dict()`工厂函数,使用`zip`创建字典,以及获取键和值的方法。这里我们提供两种方式:1.继承内置的`dict`类,这样我们的类就具有了字典的所有功能,然后我们可以添加额外的方法或重写某些方法。2.使用集合(collections)模块中的`UserDict`,这是一个专门为创建字典子类而设计的类,它比直接继承`dict`更灵活,尤其是在重写某些方法时不会出现意外行为。但注意,用户并没有要求使用`UserDict`,所以我们也可以选择简单的继承。由于用户问题中没有特殊要求,我们选择简单的方式:继承内置的`dict`类。示例:我们创建一个名为`MyDict`的类,它继承自`dict`。我们可以添加一些额外的方法,例如一个方法来交换字典的键和值(注意:值必须是不可变类型,且值唯一,否则会有问题)。但是,用户问题只是要求“定义一个包含字典功能的类”,所以我们也可以不添加额外方法,只是展示如何定义。但为了展示类的定义,我们添加一个简单的方法。另外,我们也可以考虑在初始化时做一些事情,比如记录创建时间等。下面我们定义一个简单的字典类,它包含字典的所有功能,并添加一个打印欢迎信息的方法,以及一个获取所有键值对的方法(虽然内置字典已经有方法,但我们自定义一个输出格式的方法)。注意:由于我们继承了`dict`,所以我们可以直接使用字典的所有操作。代码示例:</think>### 在 Python 中定义字典类 在 Python 中创建包含字典功能的类,可通过继承内置的 `dict` 类或实现字典魔法方法来实现。以下是两种实现方式: #### 方法 1:继承内置 `dict` 类(推荐) ```python class MyDict(dict): """自定义字典类,继承 Python 内置 dict 功能""" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) print("字典已创建") def custom_method(self): """自定义方法示例""" return f"字典包含 {len(self)} 个键值对" # 使用示例 my_dict = MyDict(name="Alice", age=30) print(my_dict) # 输出: {'name': 'Alice', 'age': 30} print(my_dict.custom_method()) # 输出: 字典包含 2 个键值对 ``` #### 方法 2:手动实现核心魔法方法 ```python class DictLike: """通过魔法方法模拟字典行为""" def __init__(self): self._data = {} def __getitem__(self, key): return self._data[key] def __setitem__(self, key, value): self._data[key] = value def __delitem__(self, key): del self._data[key] def __len__(self): return len(self._data) def __iter__(self): return iter(self._data) def __contains__(self, key): return key in self._data def __repr__(self): return repr(self._data) def keys(self): return self._data.keys() def values(self): return self._data.values() def items(self): return self._data.items() # 使用示例 d = DictLike() d["city"] = "Beijing" d["country"] = "China" print(d["city"]) # 输出: Beijing print(len(d)) # 输出: 2 print("country" in d) # 输出: True ``` ### 关键实现要点 1. **核心魔法方法**: - `__getitem__`: 实现 `obj[key]` 取值 - `__setitem__`: 实现 `obj[key] = value` 赋值 - `__delitem__`: 实现 `del obj[key]` 删除 - `__len__`: 实现 `len(obj)` - `__iter__`: 支持迭代操作 - `__contains__`: 支持 `key in obj` 检测 2. **常用方法**: - `keys()`: 返回所有键(参考引用[4]) - `values()`: 返回所有值(参考引用[4]) - `items()`: 返回键值对元组 3. **初始化方式**: - 支持 `dict(key=value)` 工厂模式(参考引用[2]) - 支持 `{key: value}` 字面量语法 - 支持 `dict(zip(keys, values))` 构造(参考引用[3]) ### 使用场景 1. **扩展字典功能**:添加数据验证、自动类型转换等 2. **特殊存储需求**:实现持久化字典、加密字典等 3. **API 封装**:创建特定领域的数据容器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

alibaba_张无忌

创作不易 可以打赏我一元呢么么

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值