来自公司做的编程竞赛题目。
在同事的提醒之下知道用前缀树来做。也就是字典树。。。这个只有一个模糊的印象。
于是网上找了一个博客看了看,定义如下链接。
https://zhuanlan.zhihu.com/p/28891541
主要是注意两个字段:
一个是count,表示当前的字符串个数。
另外一个是pre,表示以该字符串为前缀的个数。
public class TrieNode {
int count;
int prefix;
TrieNode[] nextNode=new TrieNode[26];
public TrieNode(){
count=0;
prefix=0;
}
}
本题代码如下:
public class Main1 {
public static void main(String[] args) {
String[] array = {"a", "ab", "abc", "abd", "dhjd"};
System.out.println(mm(array));
}
public static void insert(TrieNode root, String s) {
if(root==null && s.length()==1) {
return;
}
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(root.next[c-'a'] == null) {
root.next[c-'a'] = new TrieNode();
}
root = root.next[c-'a'];
root.prefix++;
}
root.count++;
}
public static class TrieNode{
int count;
int prefix;
TrieNode[] next = new TrieNode[26];
public TrieNode(){
count=0;
prefix=0;
}
}
public static String mm(String[] array) {
TrieNode trieNode = new TrieNode();
//构造前缀树
for (int i = 0; i < array.length; i++) {
insert(trieNode, array[i]);
}
//加入符合的前缀树。要小心注意a这样的单个字符串也会加入
List<String> list = new ArrayList<>();
for (int i = 0; i < array.length; i++) {
if(isRight(trieNode, array[i])) {
list.add(array[i]);
}
}
if(list.size() == 0) return "";
Collections.sort(list);
//只能从后面开始,找到和最大的那个相同的。
int len = list.get(list.size()-1).length();
String res = list.get(list.size()-1);
for (int i=list.size()-1;i>=0; i--) {
if(list.get(i).length() == len) {
res = list.get(i);
} else {
return res;
}
}
return res;
}
public static boolean isRight(TrieNode trieNode, String str) {
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
trieNode = trieNode.next[c - 'a'];
if(trieNode.count < 1) {
return false;
}
}
return true;
}
}
网友评论