java hanlp自定义字典 java创建字典_java

 思路:

本题是对类的设计,需要观察初始化代码:

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;
    }
}