3093. 最长公共后缀查询(困难)

核心思想
倒序的字典树,算是板子题吧。
也就是节点的成员变量有变化。

class Trie{
    int idx; // 下标
    int length; // 记录以此为后缀且长度最小的长度
    Trie[] son; // 儿子

    Trie(){
        idx = (int) (1e4 + 10);
        length = (int) (5e3 + 10);
        son = new Trie[26];
    }
}
class Solution {
    public int[] stringIndices(String[] wordsContainer, String[] wordsQuery) {

        Trie root = new Trie();
        int[] res = new int[wordsQuery.length];
        for(int i = 0; i < wordsContainer.length; i++){
            String s = wordsContainer[i];
            int len = s.length();

            // 把长度最小的记录到root节点
            if(len < root.length){
                root.length = len;
                root.idx = i;
            }

            //当前节点
            Trie cur = root;
            char[] charArray = s.toCharArray();
            //后缀
            for(int j = charArray.length - 1; j >=0; j--){
                int id = charArray[j] - 'a';
                // 新建儿子节点
                if(cur.son[id] == null){
                    cur.son[id] = new Trie();
                }
                cur = cur.son[id];

                //记录以此为后缀且长度最小的下标
                if(len < cur.length){
                    cur.length = len;
                    cur.idx = i;
                }
            }
        }
        for(int i = 0; i < wordsQuery.length; i++){
            String s = wordsQuery[i];
            Trie cur = root;
            Trie pre = null; //前节点
            char[] charArray = s.toCharArray();
            //后缀
            for(int j = charArray.length - 1; j >=0 && cur != null; j --){
                int id = charArray[j] - 'a';
                pre = cur;
                cur = cur.son[id];
            }
            // 如果cur为null 说明答案为前节点 否则为当前节点
            // 如果没有公共后缀pre 就是 root
            res[i] = cur == null? pre.idx: cur.idx;
        }
        return res;
    }
}
posted @ 2024-04-01 18:34  Shie1d  阅读(18)  评论(0)    收藏  举报