题解 | 字典树的实现(静态数组)

字典树的实现

https://www.nowcoder.com/practice/7f8a8553ddbf4eaab749ec988726702b


import java.io.*;

/**
 * @author cat
 * @description https://www.nowcoder.com/practice/7f8a8553ddbf4eaab749ec988726702b
 * @create 2025/7/14 09:02
 * @since JDK17
 */

class Trie {
    int MAXN = 150001;
    int[][] tree = new int[MAXN][26];
    int cnt = 1;
    int[] ends = new int[MAXN];
    int[] pass = new int[MAXN];

    public void insert(String word) {
        int cur = 1;
        pass[cur]++;
        for (int i = 0; i < word.length(); i++) {
            int path = word.charAt(i) - 'a';
            if (tree[cur][path] == 0) {
                tree[cur][path] = ++cnt;
            }
            cur = tree[cur][path];
            pass[cur]++;
        }
        ends[cur]++;
    }

    public Trie() {
        cnt = 1;
    }

    public void delete (String word) {
        if (search(word) > 0) { // 必须得先存在
            int cur = 1;
            for (int i = 0; i < word.length(); i++) {
                int path = word.charAt(i) - 'a';
                int nextNode = tree[cur][path];
                if (--pass[nextNode] == 0) {    //
                    tree[cur][path] = 0;
                    return;
                }
                cur = nextNode;
            }
            ends[cur]--;
        }
    }

    public int find(String word) {
        int cur = 1;
        for (int i = 0; i < word.length(); i++) {
            int path = word.charAt(i) - 'a';
            if (tree[cur][path] == 0) { // 不存在
                return -1;
            }
            cur = tree[cur][path];
        }
        return cur;
    }

    public int search(String word) {
        int cur = find(word);
        return cur != -1 ? ends[cur] : -1;
    }

    public int prefixNumber(String word) {
        int cur = find(word);
        return cur != -1 ? pass[cur] : 0;
    }
}
public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter pr = new PrintWriter(new OutputStreamWriter(System.out));
    static StreamTokenizer st = new StreamTokenizer(br);
    static Trie trie = new Trie();

    public static void main(String[] args) throws IOException {
        trie.cnt = 1;
        st.nextToken();
        int n = ((int) st.nval);
        for (int i = 0; i < n; i++) {
            st.nextToken();
            int opt = ((int) st.nval);
            st.nextToken();
            String word = ((String) st.sval);
            if (opt == 1) {
                trie.insert(word);
            } else if (opt == 2) {
                trie.delete(word);
            } else if (opt == 3) {
                pr.println(trie.search(word) <= 0 ? "NO" : "YES");
            } else {
                pr.println(trie.prefixNumber(word));
            }
        }
        pr.flush();
        pr.close();
        br.close();
    }
}

全部评论

相关推荐

双非本科,211硕士。自学java半年,想去找一个实习,求大佬们锐评一下简历
nsjbambmbs:简历一写就是微服务,一问实际就俩服务,简历一写就是高并发一问 QPS 个位数既然写了微服务,那我出系统设计题场景题也没啥问题吧
点赞 评论 收藏
分享
2025-12-16 17:17
门头沟学院 产品经理
烤点老白薯:他第二句话的潜台词是想让你帮他点个瑞幸或者喜茶啥的
mt对你说过最有启发的一...
点赞 评论 收藏
分享
程序员花海:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务