写点什么

【LeetCode】实现一个魔法字典 Java 题解

作者:Albert
  • 2022 年 7 月 11 日
  • 本文字数:1414 字

    阅读完需:约 5 分钟

题目描述

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


实现 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"); // 返回 FalsemagicDictionary.search("hhllo"); // 将第二个 'h' 替换为 'e' 可以匹配 "hello" ,所以返回 TruemagicDictionary.search("hell"); // 返回 FalsemagicDictionary.search("leetcoded"); // 返回 False
来源:力扣(LeetCode)链接:https://leetcode.cn/problems/implement-magic-dictionary著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码

思路分析

  • 今天的算法题目是设计类题目,需要我们设计一种数据结构,高效的完成题目要求。题目要求判定能否只将字符串中 一个 字母换成另一个字母,使得所形成的新字符串能够与字典中的任一字符串匹配。如果可以,返回 true ;否则,返回 false 。

  • 我们分解条件来使用,判断字典中是否包含字符串,我们可以先构建一个数据结构,存储所有的字典数据,方便后面使用。

  • 只将字符串中 一个 字母换成另一个字母,如果直接转换字母比较复杂,我们可以转换思维,如果当前字符串和字典中的某一个字符串不同的字母是 1 个,就可以完成转换,返回 true。具体实现代码如下,供参考。

通过代码

class MagicDictionary {    private String[] words;
public MagicDictionary() {
}
public void buildDict(String[] dictionary) { words = dictionary; }
public boolean search(String searchWord) { for (String word : words) { if (word.length() != searchWord.length()) { continue; }
int diff = 0; for (int i = 0; i < word.length(); ++i) { if (word.charAt(i) != searchWord.charAt(i)) { ++diff; if (diff > 1) { break; } } } if (diff == 1) { return true; } } return false; }}
/** * Your MagicDictionary object will be instantiated and called as such: * MagicDictionary obj = new MagicDictionary(); * obj.buildDict(dictionary); * boolean param_2 = obj.search(searchWord); */
复制代码

总结

  • search() 的时间复杂度是 O(n * n), 空间复杂度是 O(n)

  • 坚持算法每日一题,加油!

发布于: 刚刚阅读数: 2
用户头像

Albert

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】实现一个魔法字典Java题解_LeetCode_Albert_InfoQ写作社区