核心思想
倒序的字典树,算是板子题吧。
也就是节点的成员变量有变化。
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;
}
}
标签:cur,后缀,Trie,length,查询,3093,int,root
From: https://www.cnblogs.com/ganyq/p/18109143