记录一下,可用于自动补全..
class TrieNode{
private TrieNode[] nodes; //保存下一个Trie节点
private boolean isWord; //记录这个序列是否是一个单词
public TrieNode(){
nodes = new TrieNode[26]; //一共26个字母,0-25对应a-z
}
public TrieNode get(char ch){
return nodes[ch - 'a'];
}
public void put(char ch,TrieNode node){
nodes[ch - 'a'] = node;
}
public boolean containKey(char ch){
return nodes[ch - 'a'] != null;
}
public void setIsWord(){
isWord = true;
}
public boolean isWord(){
return isWord;
}
}
class Trie {
private TrieNode root;
public Trie() {
root = new TrieNode();
}
//将一个单词插入root中,建立前缀树
public void insert(String word) {
TrieNode node = root;
for (int i = 0; i < word.length(); i++) {
char ch = word.charAt(i);
if (!node.containKey(ch)) {
node.put(ch, new TrieNode());
}
node = node.get(ch);
}
node.setIsWord();
}
//搜索有没有这个单词
public boolean search(String word) {
TrieNode node = root;
for (int i = 0; i < word.length() && node != null; i++) {
char ch = word.charAt(i);
if (!node.containKey(ch)) {
node.get(ch);
}
node = node.get(ch);
}
return node != null ? node.isWord() : false;
}
//搜索是否有这个前缀的单词
public boolean startsWith(String prefix) {
TrieNode node = root;
for (int i = 0; i < prefix.length() && node != null; i++) {
char ch = prefix.charAt(i);
if (!node.containKey(ch)) {
node.get(ch);
}
node = node.get(ch);
}
return node != null;
}
}