题解 | #字典树的实现#

字典树的实现

https://www.nowcoder.com/practice/a55a584bc0ca4a83a272680174be113b

import java.util.*;


public class Solution {
    /**
     * 
     * @param operators string字符串二维数组 the ops
     * @return string字符串一维数组
     */
    // 定义一个字典树的结构,一个是节点内容,另外一个是节点对应的一些特征信息比如多少个单词经过这个节点以及多少个单词以这个节点结尾,这些特征主要是为了方便后续遍历时候的统计
    public static class TireTree{
	  	// 定义一个节点的结构
        public static class TreeNode{
            public int pathNumber;//表示多少个单词公用这个节点
            public int endNumber;//表示多少个单词以这个节点结尾
            public Map<Character,TreeNode> map;
            public TreeNode(){
                pathNumber=0;
                endNumber=0;
                map=new HashMap<>();
            }
        }
        private TreeNode root;

        public TireTree(){
            root = new TreeNode();
        }
        // 将一个单词插入到字典树
        public void insert(String word){
            if(word==null||word.length()==0){
                return;
            }
            TreeNode node = root;
            for(int i=0;i<word.length();i++){
                char ch=word.charAt(i);
                //若没有对应的节点,需要创建节点,若有了节点,需要迭代到下一个节点,并且让节点对应的pathNumber++
                if(!node.map.containsKey(ch)){
                    node.map.put(ch,new TreeNode());
                }
                node = node.map.get(ch);
                node.pathNumber++;
            }
            //结束之后需要将以这个节点为终点的数量+1
            node.endNumber++;
        }
        // 查询一个单词是否在字典数当中
        public boolean search(String word){
            if(word==null||word.length()==0){
                return false;
            }
            TreeNode node=root;
            for(int i=0;i<word.length();i++){
                char ch=word.charAt(i);
                if(!node.map.containsKey(ch)){
                    return false;
                }
                node=node.map.get(ch);
            }
            return node.endNumber!=0;
        }
        // 删除一个单词路径
        public void delete(String word){
            // 需要先判断这个单词是不是在字典树当中
            if(search(word)){
                //给每层的node的pathNumber--,最后记得给最后一个节点的endNumber--
                TreeNode node=root;
                for(int i=0;i<word.length();i++){
                    char ch=word.charAt(i);
				  	// 这里其实是一个优化,或者说对于后续的节点来说,如果没有了经过的节点需要一个一个的全部删除掉
                    if((node.map.get(ch).pathNumber--)==0){
                        node.map.remove(ch);
                        return;
                    }
                    node=node.map.get(ch);
                }
                node.endNumber--;
            }
        }
        public int preSearch(String preWord){
            TreeNode node=root;
            for(int i=0;i<preWord.length();i++){
                char ch=preWord.charAt(i);
                if(!node.map.containsKey(ch)){
                    return 0;
                }
                node=node.map.get(ch);
            }
            return node.pathNumber;
        }

    }
    public String[] trieU (String[][] operators) {
        // write code here
        List<String> res=new ArrayList<>();
        if(operators==null||operators.length==0){
            return new String[0];
        }
        int len=operators.length;
        TireTree tree = new TireTree();
        for(int i=0;i<len;i++){
            String op=operators[i][0];
            String word=operators[i][1];
            if("1".equals(op)){
                tree.insert(word);
            }else if("2".equals(op)){
                tree.delete(word);
            }else if("3".equals(op)){
                if(tree.search(word)){
                    res.add("YES");
                }else{
                    res.add("NO");
                }
            }else if("4".equals(op)){
                res.add(""+tree.preSearch(word));
            }
        }
        return res.toArray(new String[res.size()]);
    }
}

全部评论

相关推荐

12-01 12:34
已编辑
广东工业大学 Java
如题,fw🐭🐭,加上准备的太晚,大三上已找不到日常实习,导致连锁反应,下学期的暑期实习找不到好的实习,导致秋招找不到中大厂,现在是中小厂Java还有考公的选择,由于有些中小厂工作强度比肩大厂,钱还少,感觉不如考公如果🐮u们是我现在这种情况,会怎么选?
负债的混子:关注你一段时间了,突然发现你头像名字都改了,想必是这段时间压力很大。关于就业还是考公的选择,就像很多牛友说的:不要美化自己没走过的路。你现在想往互联网发展,发现这条路很难走,然后想往考公发展,但是你没走过考公这条路,所以你不知道这条路的压力如何。你今年大三了,还有时间给你做选择,我希望你能够尽快的决定自己的方向,然后一条路走到黑,而不是在这里徘徊,每个人的道路是不一样的,你无法复刻别人的路,你能做的就是尽力的完善自己。 最后,我想说的是,加油,陌生人!
点赞 评论 收藏
分享
12-02 14:27
Java
牛可乐121381:好的,谢谢你,韩明轩同学
点赞 评论 收藏
分享
牛客569470950号:也不知道是哪个群体45年前鬼哭狼嚎的为自己争取的被剥削的权利
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务