今天做的一个题,开始用一般的字符串方法去做,但是时间复杂度非常高,看了评论之后去写了一个trie类。
谈谈我对于trie的用处的理解:比方说我有很多字符串,如果要在这些字符串里面查找一个特定的字符串,我们需要的时间复杂度是O(n),但是我构造一个trie树,那么我的时间复杂度就是log26(n),也就是O(logn),所有能大大减小我的查找次数。
另外,当我找到一个字符串时,我在trie树向下遍历,就能找到以这个字符串为前缀的所有字符串,这和浏览器中我们输入一个字符串浏览器自动提示可能要浏览的信息一样。
public class Trie {
TrieNode root;
public Trie() {
root=new TrieNode();
}
public void add(String s) {
char sc[]=s.toCharArray();
int len=s.length(),i=0;
TrieNode p=root;
while(i<len) {
if(p.son[sc[i]-'a']==null)
p.son[sc[i]-'a']=new TrieNode();
p.son[sc[i]-'a'].word=p.word+sc[i];
p=p.son[sc[i]-'a'];
p.ch=sc[i];
i++;
}
p.word=s;
}
boolean contain(String s) {
char sc[]=s.toCharArray();
int i=0,len=s.length();
TrieNode p=root;
while(i<len) {
if(p.son[sc[i]-'a']==null) {
return false;
}
else {
p=p.son[sc[i]-'a'];
i++;
}
}
return true;
}
TrieNode getprefix(String s) {
char sc[]=s.toCharArray();
int len=s.length(),i=0;
TrieNode p=root;
while(i<len) {
if(p.son[sc[i]-'a']==null)
return null;
else {
p=p.son[sc[i]-'a'];
i++;
}
}
return p;
}
class TrieNode{
String word;//从根到这个节点所有字母连成的单词
char ch;//这个节点代表的字母
TrieNode son[];
public TrieNode(){
word=null;
son=new TrieNode[26];
}
}
}