【LeetCode】676. Implement Magic Dictionary 解题报告(Python & C++)
作者: 负雪明烛
 id: fuxuemingzhu
 个人博客: http://fuxuemingzhu.cn/
题目地址:https://leetcode.com/problems/implement-magic-dictionary/description/
题目描述
Implement a magic directory with buildDict, and search methods.
For the method buildDict, you’ll be given a list of non-repetitive words to build a dictionary.
For the method search, you’ll be given a word, and judge whether if you modify exactly one character into another character in this word, the modified word is in the dictionary you just built.
Example 1:
Input: buildDict(["hello", "leetcode"]), Output: Null
Input: search("hello"), Output: False
Input: search("hhllo"), Output: True
Input: search("hell"), Output: False
Input: search("leetcoded"), Output: False
Note:
- You may assume that all the inputs are consist of lowercase letters a-z.
- For contest purpose, the test data is rather small by now. You could think about highly efficient algorithm after the contest.
- Please remember to RESET your class variables declared in class MagicDictionary, as static/class variables are persisted across multiple test cases. Please see here for more details.
题目大意
判断只修改一个字符的情况下,能不能把search()输入的字符串变成buildDict()中已有的字符。
解题方法
字典
这个题可以直接使用dict完成。我们在进行buildDict()操作的时候就统计出如果修改一个字符能变成的字符串的个数。在search的过程中,我们要同样的看该word在修改一个字符的情况下能变成哪些字符串。
注意题目中说search时不能和已有的字符串完全一样,但是如果修改该词的某个字符构成的字符串能在buildDict()中出现的次数>1,那么说明可被与其不等的其他的字符串修改一个字符串构成。
顺便学习了一下python运算符的优先级:
优先级关系:or<and<not,同一优先级默认从左往右计算。
用案例进行说明:
Your input
["MagicDictionary", "buildDict", "search", "search", "search", "search"]
[[], [["hello","leetcode"]], ["hello"], ["hhllo"], ["hell"], ["leetcoded"]]
["MagicDictionary", "buildDict", "search", "search", "search", "search"]
[[], [["hello","hallo","leetcode"]], ["hello"], ["hhllo"], ["hell"], ["leetcoded"]]
Your stdout
set([u'hello', u'leetcode'])
Counter({u'leetc*de': 1, u'*ello': 1, u'lee*code': 1, u'le*tcode': 1, u'leetco*e': 1, u'h*llo': 1, u'hel*o': 1, u'l*etcode': 1, u'leetcod*': 1, u'*eetcode': 1, u'hell*': 1, u'he*lo': 1, u'leet*ode': 1})
set([u'hallo', u'hello', u'leetcode'])
Counter({u'h*llo': 2, u'leetc*de': 1, u'*ello': 1, u'hall*': 1, u'ha*lo': 1, u'le*tcode': 1, u'hal*o': 1, u'hel*o': 1, u'l*etcode': 1, u'leetco*e': 1, u'leetcod*': 1, u'lee*code': 1, u'*allo': 1, u'hell*': 1, u'he*lo': 1, u'*eetcode': 1, u'leet*ode': 1})
Your answer
[null,null,false,true,false,false]
[null,null,true,true,false,false]
代码:
class MagicDictionary(object):
    def _candidate(self, word):
        for i in range(len(word)):
            yield word[:i] + '*' + word[i+1:]
    def buildDict(self, words):
        """
        Build a dictionary through a list of words
        :type dict: List[str]
        :rtype: void
        """
        self.words = set(words)
        print self.words
        self.near = collections.Counter([word for word in words for word in self._candidate(word)])
        print self.near
    def search(self, word):
        """
        Returns if there is any word in the trie that equals to the given word after modifying exactly one character
        :type word: str
        :rtype: bool
        """
        return any(self.near[cand] > 1 or self.near[cand] == 1 and word not in self.words for cand in self._candidate(word))
# Your MagicDictionary object will be instantiated and called as such:
# obj = MagicDictionary()
# obj.buildDict(dict)
# param_2 = obj.search(word)
汉明间距
题目的意思其实就是找汉明间距为1的字符串。
二刷的时候,使用更简单的方法。首先判断字符串长度是否相等,在相等的情况下,判断字符串之间不同的字符是不是只有一位,如果是的话,那就返回true;如果遍历结束都没找到最后的结果,就返回false;
class MagicDictionary {
public:
    /** Initialize your data structure here. */
    MagicDictionary() {
    }
    /** Build a dictionary through a list of words */
    void buildDict(vector<string> dict) {
        d = dict;
    }
    /** Returns if there is any word in the trie that equals to the given word after modifying exactly one character */
    bool search(string word) {
        for (string wd : d) {
            const int N = wd.size();
            if (N == word.size()) {
                int diff = 0;
                for (int i = 0; i < N; ++i) {
                    if (wd[i] != word[i])
                        diff ++;
                }
                if (diff == 1)
                    return true;
            }
        }
        return false;
    }
private:
    vector<string> d;
};
/**
 * Your MagicDictionary object will be instantiated and called as such:
 * MagicDictionary obj = new MagicDictionary();
 * obj.buildDict(dict);
 * bool param_2 = obj.search(word);
 */
日期
2018 年 3 月 5 日
 2018 年 12 月 18 日 —— 改革开放40周年
【LeetCode】676. Implement Magic Dictionary 解题报告(Python & C++)的更多相关文章
- [LeetCode] 676. Implement Magic Dictionary 实现神奇字典
		Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll be ... 
- LeetCode 676. Implement Magic Dictionary实现一个魔法字典 (C++/Java)
		题目: Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll ... 
- Week6 - 676.Implement Magic Dictionary
		Week6 - 676.Implement Magic Dictionary Implement a magic directory with buildDict, and search method ... 
- LC 676. Implement Magic Dictionary
		Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll be ... 
- 676. Implement Magic Dictionary
		Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll be ... 
- 【LeetCode】62. Unique Paths 解题报告(Python & C++)
		作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/unique-pa ... 
- 【LeetCode】911. Online Election 解题报告(Python)
		[LeetCode]911. Online Election 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ ... 
- 【LeetCode】385. Mini Parser 解题报告(Python)
		[LeetCode]385. Mini Parser 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/mini-parser/ ... 
- 【LeetCode】376. Wiggle Subsequence 解题报告(Python)
		[LeetCode]376. Wiggle Subsequence 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.c ... 
随机推荐
- 23-Longest Substring Without Repeating Characters
			Given a string, find the length of the longest substring without repeating characters. Examples: Giv ... 
- Prometheus概述
			Prometheus是什么 首先, Prometheus 是一款时序(time series) 数据库, 但他的功能却并非支部与 TSDB , 而是一款设计用于进行目标 (Target) 监控的关键组 ... 
- 使用dumi生成react组件库文档并发布到github pages
			周末两天玩了下号称西湖区东半球最牛逼的react文档站点生成工具dumi,顺带结合github pages生成了react-uni-comps文档站, 一套弄下来,感觉真香,现在还只是浅尝,高级的特性 ... 
- LeetCode子矩形查询
			LeetCode 子矩形查询 题目描述 请你实现一个类SubrectangleQueries,它的构造函数的参数是一个rows * cols的矩形(这里用整数矩阵表示),并支持以下两种操作: upda ... 
- CSS系列,三栏布局的四种方法
			三栏布局.两栏布局都是我们在平时项目里经常使用的,今天我们来玩一下三栏布局的四种写法,以及它的使用场景. 所谓三栏布局就是指页面分为左中右三部分然后对中间一部分做自适应的一种布局方式. 1.绝对定位法 ... 
- 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(七)-准备移植FatFs
			[STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 [STM3 ... 
- java web 限制同一个用户在不同处登入
			用到的技术:map集合,sessionListener监听器,Fiter过滤器. 实现思路: 一.利用一个全局的map集合来保存每个用户sessionID的值的一个集合.一个用户对应一个session ... 
- shell脚本统计多个CPU利用率
			本节主要内容:top命令统计CPU的利用率 一,问题分析 MySQL在Linux下是多线程的,而且只能将多个线程分布到一个CPU上.因此,使用小型服务器,或者PC SERVER,多个CPU利用率并不高 ... 
- 使用fastDFS上传和下载图片文件
			package com.xuecheng.test.fastdfs;import org.csource.common.MyException;import org.csource.fastdfs.* ... 
- synchronized底层浅析(二)
			一张图了解锁升级流程: 
