刷题的日常-实现一个魔法字典

124 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

刷题的日常

一天一题,保持脑子清爽

实现一个魔法字典

来自leetcode的 676 题,题意如下:

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

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

理解题意

我们可以从题意中提取的条件如下:

  • 题目给出一个字典
  • 然后会多次调用查询
  • 要返回用一次替换匹配上的单词
  • 如果没有替换,那么就不算匹配

做题思路

这里采用暴力解:

  • 直接保存所有的字典信息
  • 每次搜索都将所有单词进行匹配
  • 统计单词差异的数量,如果差异是1,直接返回即可
  • 如果是0,那么意味着不存在替换的情况,需要返回false
  • 如果大于一,肯定是进行了多次替换,也是不行的
  • 这里可以用Map将长度做映射,因为长度不匹配肯定也不对

代码实现

代码实现也很简单,如下:

public class MagicDictionary {

    Map<Integer, List<String>> map;

    public MagicDictionary() {
        map = new HashMap<>();
    }

    public void buildDict(String... dictionary) {
        for (String str : dictionary) {
            List<String> strList = map.computeIfAbsent(str.length(), o -> new ArrayList<>());
            strList.add(str);
        }
    }

    public boolean search(String searchWord) {
        List<String> strList = map.get(searchWord.length());
        if (strList == null) {
            return false;
        }
        int diff;
        for (String str : strList) {
            diff = 0;
            for (int i = 0; i < str.length(); i++) {
                if (str.charAt(i) != searchWord.charAt(i)) {
                    if (++diff > 1) {
                        break;
                    }
                }
            }
            if (diff == 1) {
                return true;
            }
        }
        return false;
    }
}