思路:
本题是对类的设计,需要观察初始化代码:
MagicDictionary obj = new MagicDictionary();
obj.buildDict(dictionary);
boolean param_2 = obj.search(searchWord);
可以看出,初始化一个MagicDictionary对象obj,调用类方法buildDict将单词列表添加,再调用search方法对某一个单词进行判断,返回一个boolean值。
输入
// 本行是指初始化对象,调用buildDict方法记录单词列表,调用四次search方法
["MagicDictionary", "buildDict", "search", "search", "search", "search"]
// 第一个[]是指初始化对象,记录单词列表["hello", "leetcode"]至words,对后四个单词进行判断
[[], [["hello", "leetcode"]], ["hello"], ["hhllo"], ["hell"], ["leetcoded"]]
输出
[null, null, false, true, false, false]
解释
MagicDictionary magicDictionary = new MagicDictionary();
magicDictionary.buildDict(["hello", "leetcode"]);
magicDictionary.search("hello"); // 返回 False
magicDictionary.search("hhllo"); // 将第二个 'h' 替换为 'e' 可以匹配 "hello" ,所以返回 True
magicDictionary.search("hell"); // 返回 False
magicDictionary.search("leetcoded"); // 返回 False
解析步骤:
当前存入单词列表["hello", "leetcode"],第一个判断hello,与单词列表比较存在与它等长单词,但是字母不同数为0,所以结果返回false;第二个判断hhllo,与单词列表比较存在与它等长单词,并且字母相同数只为1,'e'与'h'不同,结果返回true;第三个与第四个不存在与单词列表等长的单词,均返回false。
代码设计:
按照模板MagicDictionary类,存在无参参构造器,按题意不需进行操作;通过buildDict方法将单词列表添加进去,我们就需要相同类型的数组去接收这个数据,那么就在类内设置一个字符串数组;重点就是对输入的单词进行判断是否有一个字母差的单词:在判断前初始化的对象已经存在给出的单词列表,对单词列表进行遍历(题给定我们单词列表长度至少为1,因此不需要进行非空判断),为了简便比较,先比较搜索单词长度与列表中是否存在等长单词,一次一次比较,不等长就使用关键词continue,结束当次循环;当寻找到等长单词,就需要关键的一步比较,字母不同差为1,定义一个diff记录字母不同差,逐个比较每个单词,当diff超过1之后本次循环就不需要继续了,使用关键词break结束循环。当单词长度相同时的遍历结束并且diff的值为1,返回true;反之所有循环结束都没有返回值就返回false。
class MagicDictionary {
// 创建字符串数组,用于记录单词
private String[] words;
public MagicDictionary() {
}
public void buildDict(String[] dictionary) {
// 将单词列表数据送给words
words = dictionary;
}
public boolean search(String searchWord) {
// 遍历每个单词
for(String word : words){
// 搜索的单词长度与words中的单词长度比较,不同继续遍历,有往后走,无结束返回false;
if (word.length() != searchWord.length()){
continue;
}
// 定义diff记录相同长度的单词与搜索单词不同字母的数量
int diff = 0;
// 遍历每个字母
for (int i = 0; i < word.length(); i++){
if (word.charAt(i) != searchWord.charAt(i)){
diff++;
// 当不同已经超过1之后,就可以结束啦
if (diff > 1){
break;
}
}
}
// 不同为1返回true
if (diff == 1){
return true;
}
}
// 遍历结束都没有返回值,返回false
return false;
}
}