力扣刷题日记 211. 添加与搜索单词

211. 添加与搜索单词

题目

在这里插入图片描述

解题思路

	从读题我们就不难看出,这是一道考字典树的题,因为查询时有可能带有“.”,所以无法按暴力的方法直接匹配
整个字符串,而是要一个个字符进行匹配,所以简单的暴力方法是行不通的,只能通过字典树的方式来求解,那么其
实发现这一点后就很好写了,只是要判断一下结尾点,因为如果存有“and”,如果查找的是“an”,那么简单的查找的
结果是True,而其实是false,注意了这一点,其实就没问题了。

代码

class WordDictionary {
    
    class treeNode{//定义的树节点
        char val;//该节点代表的字符
        boolean end = false;//判断这个节点是不是已存入的某一个字符串的结尾
        List child = new ArrayList<>();//孩子节点
    }
    treeNode root;
    public WordDictionary() {
        root = new treeNode();
    }
    
    public void addWord(String word) {
         addInTree(root,0,word);
    }
    
    private void addInTree(treeNode root,int i,String word){//把字符串加入到里面去
        if(i == word.length()){//如果已经加完了,就在最后一个节点打上end标记
            root.end=true;
            return;
        }
        char now = word.charAt(i);
        //System.out.println(now);
        for(Object s:root.child){
            treeNode nowNode = (treeNode) s;
            if(nowNode.val == now){
              addInTree(nowNode,i+1,word);
              return;
            }
        }//寻找当前字符是否存在在孩子节点里,有则继续
        treeNode newChildNode = new treeNode();
        newChildNode.val = now;
        root.child.add(newChildNode);
        addInTree(newChildNode,i+1,word);//没有则添加进去
    }
    public boolean search(String word) {
         return findInTree(root,0,word);
    }
    private boolean findInTree(treeNode root,int i,String word){//进行匹配
        if(i == word.length()){//如果字符串匹配完成
                return root.end;//如果这个节点不是某字符串的终点就说明不存在
        }
        char now = word.charAt(i);
        boolean ans = false;
        for(Object s:root.child){
            treeNode nowNode = (treeNode) s;
            if(now == '.' || nowNode.val == now){//如果遇到点就要进入所有的子节点进行判定
               ans = (ans || findInTree(nowNode,i+1,word));//或不会改变True结果,当然加上if判断如果等于true直接返回退出的话更节省时间
            }
        }
        return ans;
    }
}

/**
 * Your WordDictionary object will be instantiated and called as such:
 * WordDictionary obj = new WordDictionary();
 * obj.addWord(word);
 * boolean param_2 = obj.search(word);
 */

结语

如果有想一起每天互相监督刷题的小伙伴可以加上微信,咱们一起加油呀!也可以一起讨论讨论题目

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值