Trie树的插入,查前缀,查单词,删前缀和删单词。

这个Trie原先用C++就敲得很熟了,看了蓝桥杯的视频后学会把一个功能这样封装起来,以后用的时候就很爽可以直接调用了,所以就用Java写了;

public class Trie {
    private final int SIZE = 26;
    private final int HEAD = 'a';
    private int cnt;
    private int tail;
    private Trie[] next = new Trie[SIZE];
    void insert(String s) {
        Trie now = this;
        for (int i = 0; i < s.length(); i++) {
            int id = s.charAt(i) - HEAD;
            if (now.next[id] == null) {
                now.next[id] = new Trie();
            }
            now = now.next[id];
            now.cnt++;
        }
        now.tail++;
    }
    int queryPrefix(String s) {
        Trie now = this;
        for (int i = 0; i < s.length(); i++) {
            int id = s.charAt(i) - HEAD;
            if (now.next[id] == null) {
                return 0;
            }
            now = now.next[id];
        }
        return now.cnt;
    }
    int queryWord(String s) {
        Trie now = this;
        for (int i = 0; i < s.length(); i++) {
            int id = s.charAt(i) - HEAD;
            if (now.next[id] == null) {
                return 0;
            }
            now = now.next[id];
        }
        return now.tail;
    }
    void deletePrefix(String s) {
        int sum = queryPrefix(s);
        if (sum == 0) {
            return;
        }
        Trie now = this;
        for (int i = 0; i < s.length(); i++) {
            int id = s.charAt(i) - HEAD;
            now.next[id].cnt -= sum;
            if (now.next[id].cnt == 0) {
                now.next[id] = null;
                return;
            }
        }
    }
    void deleteWord(String s) {
        int sum = queryWord(s);
        if (sum == 0) {
            return;
        }
        Trie now = this;
        for (int i = 0; i < s.length(); i++) {
            int id = s.charAt(i) - HEAD;
            now.next[id].cnt -= sum;
            if (now.next[id].cnt == 0) {
                now.next[id] = null;
                return;
            }
        }
        now.tail -= sum;
    }
}

猜你喜欢

转载自www.cnblogs.com/Angel-Demon/p/10243668.html