一个字符串类型的数组arr1,另一个字符串类型的数组arr2,arr2中有哪些字符是arr1中出现的。arr2中有哪些字符是作为arr1中某个字符串前缀出现的,arr2中有哪些字符是作为arr1中某个字符串的前缀出现的,打印arr2中出现次数最大的前缀
public class TrieTree {
public static class TrieNode{
public int path;
public int end;
public TrieNode[] nexts;
public TrieNode() {
this.path = 0;
this.end = 0;
this.nexts = new TrieNode[26];
}
}
public static class Trie{
private TrieNode root;
public Trie() {
root = new TrieNode();
}
//创建前缀树
private void insert(String word){
if (StringUtils.isEmpty(word)){
return;
}
char[] chars = word.toCharArray();
int index = 0;
TrieNode node = root;
for (int i = 0; i < chars.length; i++) {
index = chars[i] - 'a';
if (node.nexts[index] == null){
node.nexts[index] = new TrieNode();
}
node = node.nexts[index];
node.path++;
}
node.end++;
}
//判断是否出现过这个字符串
private int search(String word){
if (StringUtils.isEmpty(word)){
return 0;
}
char[] chars = word.toCharArray();
int index = 0;
TrieNode node = root;
for (int i = 0; i < chars.length; i++) {
index = chars[i] - 'a';
if (node.nexts[index] == null){
return 0;
}
node = node.nexts[index];
}
return node.end;
}
//删除字符串
private void delete(String word){
if (StringUtils.isEmpty(word)){
return;
}
if (search(word) == 0){
return;
}
char[] chars = word.toCharArray();
int index = 0;
TrieNode node = root;
for (int i = 0; i < chars.length; i++) {
index = chars[i] - 'a';
if (--node.nexts[index].path == 0){
node.nexts[index] = null;
return;
}
node = node.nexts[index];
}
node.end--;
}
//字符串作为前缀出现过多少次
private int prefixNum(String word){
if (StringUtils.isEmpty(word)){
return 0;
}
char[] chars = word.toCharArray();
int index = 0;
TrieNode node = root;
for (int i = 0; i < chars.length; i++) {
index = chars[i] - 'a';
if (node.nexts[index] == null){
return 0;
}
node = node.nexts[index];
}
return node.path;
}
}
public static void main(String[] args) {
Trie trie = new Trie();
System.out.println(trie.search("happy"));
trie.insert("happy");
trie.insert("birthday");
trie.insert("tom");
trie.insert("happy");
trie.insert("happy");
System.out.println(trie.search("happy"));
trie.delete("happy");
System.out.println(trie.search("happy"));
System.out.println(trie.prefixNum("birthday"));
}
}