携手创作,共同成长!这是我参与「掘金日新计划 · 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;
}
}