闲着写了一个字典树的模板,包括:生成字典树,查询某个字符串(前缀)是否出现以及次数,打印某个前缀所涉及的字符串等功能
package aaa;
import java.util.*;
public class Main {
static Scanner in = new Scanner(System.in);
static Node root;
static int n;
public static void main(String[] args) {
n = in.nextInt();
String s;
root = new Node();
for(int i = 0; i < n;i++) {
s = in.next();
root.insert(root, s);
}
String str = in.next();
root.printStr(root, str);
}
}
class Node{
static int kind = 0;
int num;//出现次数
int id;//在树中的数字索引
boolean isend;//是否到了单词的结束
Node[] son;//儿子节点
char val;
Node(){
id = 0;
num = 0;
son = new Node[26];
isend = false;
}
int insert(Node root,String str) {
Node t = root;
int k;
for(int i = 0; i < str.length();i++) {
k = str.charAt(i)-'a';
if(t.son[k]==null) {
t.son[k]= new Node();
t.son[k].val = str.charAt(i);
}
t.son[k].num++;
t = t.son[k];
}
if(t.isend)
return t.id;
else {
t.isend = true;
t.id = kind++;
return t.id;
}
}
int conut(Node root,String str) {
int k;
Node t = root;
for(int i = 0;i < str.length();i++) {
k = str.charAt(i)-'a';
if(t.son[k]==null) return 0;
else
t = t.son[k];
}
return t.num;
}
void printStr(Node root,String prefix) {
int k;
Node t = root;
for(int i = 0;i < prefix.length();i++) {
k = prefix.charAt(i)-'a';
if(t.son[k]==null) return;
else
t = t.son[k];
}
preTraverse(t,prefix);
return ;
}
void preTraverse(Node root,String prefix) {
if(root.isend) {
System.out.println(prefix);
return ;
}
for (Node child : root.son){
if (child!=null){
preTraverse(child, prefix+child.val);
}
}
}
}