题目
类型:数组
解题思路
回到本题,起始先将所有的 words[i] 存入字典树,并记录每个字符的结尾编号。
对于某个 words[i] 而言,其能成为「合法单词」的充要条件为:words[i] 的每个前缀编号都有「以结尾编号」所被记录。
一些细节:为了防止每个样例都 new 大数组,我们使用 static 进行优化,并在跑样例前进行相应的清理工作。
代码
class Solution {
static int N = 30010, M = 26;
static int[][] tr = new int[N][M];
static boolean[] isEnd = new boolean[N];
static int idx = 0;
void add(String s) {
int p = 0, n = s.length();
for (int i = 0; i < n; i++) {
int u = s.charAt(i) - 'a';
if (tr[p][u] == 0) tr[p][u] = ++idx;
p = tr[p][u];
}
isEnd[p] = true;
}
boolean query(String s) {
int p = 0, n = s.length();
for (int i = 0; i < n; i++) {
int u = s.charAt(i) - 'a';
p = tr[p][u];
if (!isEnd[p]) return false;
}
return true;
}
public String longestWord(String[] words) {
Arrays.fill(isEnd, false);
for (int i = 0; i <= idx; i++) Arrays.fill(tr[i], 0);
idx = 0;
String ans = "";
for (String s : words) add(s);
for (String s : words) {
int n = s.length(), m = ans.length();
if (n < m) continue;
if (n == m && s.compareTo(ans) > 0) continue;
if (query(s)) ans = s;
}
return ans;
}
}