题目
类型:数组
解题思路
回到本题,起始先将所有的 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;}}
