1.往字典树里面插入字符串
2.查找以指定字符串开头的所有字符串
3.字符串都是小写英文字母
public class TreeNode {
TreeNode[] childen;
boolean isEnd;
public TreeNode(){
childen = new TreeNode[26];
}
public void insert(String word){
TreeNode node = this;
for (int i=0;i<word.length();i++){
char ch = word.charAt(i);
int index = ch - 'a';
if (node.childen[index] == null){
node.childen[index] = new TreeNode();
}
node = node.childen[index];
}
node.isEnd = true;
}
public TreeNode search(String word) {
TreeNode node = this;
for (int i = 0; i < word.length(); i++) {
char ch = word.charAt(i);
int index = ch - 'a';
if (node.childen[index] == null) {
return null;
}
node = node.childen[index];
}
return node;
}
public List<String> findPre(String word){
TreeNode node = search(word);
if (node == null){
return null;
}
List<String> result = visit(node,word);
if (node.isEnd){
result.add(0,word);
}
return result;
}
public List<String> visit(TreeNode node,String pre){
List<String> list = new ArrayList<>();
for (int i=0;i<26;i++){
if (node.childen[i] == null){
continue;
}
if (node.childen[i].isEnd){
list.add(pre+ (char)(i+'a'));
}
list.addAll(visit(node.childen[i],pre+ (char)(i+'a')));
}
return list;
}
测试
public static void main(String[] args) {
TreeNode node = new TreeNode();
List<String> list = new ArrayList<>(50);
for (int i=0;i<50;i++){
String s = randomStr();
list.add(s);
node.insert(s);
}
Collections.sort(list);
System.out.println(list);
for (char ch='a';ch<='z';ch++){
System.out.println(ch+"开头:"+node.findPre(ch+""));
}
}
public static String randomStr(){
Random random = new Random();
int len = random.nextInt(10)+2;
StringBuilder sb = new StringBuilder();
for (int i=0;i<len;i++){
sb.append((char) (random.nextInt(26)+'a'));
}
return sb.toString();
}
结果
[aeowpfnb, anxbg, bjfbmbzfeaa, bkjyc, bwnz, bxabz, cgwgojor, dswurlv, eqemp, faqdg, flsqtbzup, fzt, ghz, gnded, hv, igjysp, ikdusvs, iq, jdcvpogxsy, jkpwtw, jx, keaxon, kv, lawqisp, lft, lz, mqgdzdsjah, mwtr, naozsk, osa, ou, pozuzcav, pxruylcagyw, qlkky, qtrqcvj, qzu, rjtbrmrkv, scbetoyfjre, se, ss, uhshyysheta, vfv, vnxocmtyjr, wrugz, xh, xnddfhrev, yfnkxjsgg, ytidv, zdxiauzlcjl, zhp]
a开头:[aeowpfnb, anxbg]
b开头:[bjfbmbzfeaa, bkjyc, bwnz, bxabz]
c开头:[cgwgojor]
d开头:[dswurlv]
e开头:[eqemp]
f开头:[faqdg, flsqtbzup, fzt]
g开头:[ghz, gnded]
h开头:[hv]
i开头:[igjysp, ikdusvs, iq]
j开头:[jdcvpogxsy, jkpwtw, jx]
k开头:[keaxon, kv]
l开头:[lawqisp, lft, lz]
m开头:[mqgdzdsjah, mwtr]
n开头:[naozsk]
o开头:[osa, ou]
p开头:[pozuzcav, pxruylcagyw]
q开头:[qlkky, qtrqcvj, qzu]
r开头:[rjtbrmrkv]
s开头:[scbetoyfjre, se, ss]
t开头:null
u开头:[uhshyysheta]
v开头:[vfv, vnxocmtyjr]
w开头:[wrugz]
x开头:[xh, xnddfhrev]
y开头:[yfnkxjsgg, ytidv]
z开头:[zdxiauzlcjl, zhp]