好吧,又写了一遍字典树,已经写了n遍了。不过希望下次把线段树学会~
上代码:
class TrieNode {
public:
int tag;
TrieNode *next[26];
// Initialize your data structure here.
TrieNode() {
int i;
for(i=0;i<26;i++) next[i]=NULL;
tag=0;
}
};
class Trie {
public:
Trie() {
root = new TrieNode();
}
// Inserts a word into the trie.
void insert(string word) {
TrieNode *tempRoot=root;
int i;
for(i=0;i<word.length();i++)
{
if(tempRoot->next[word[i]-'a']==NULL)
{
TrieNode * newNode=new TrieNode();
tempRoot->next[word[i]-'a']=newNode;
}
tempRoot=tempRoot->next[word[i]-'a'];
}
tempRoot->tag=1;
}
// Returns if the word is in the trie.
bool search(string word) {
TrieNode *tempRoot=root;
int i;
for(i=0;i<word.length();i++)
{
if(tempRoot->next[word[i]-'a']!=NULL) tempRoot=tempRoot->next[word[i]-'a'];
else return false;
}
return tempRoot->tag==1;
}
// Returns if there is any word in the trie
// that starts with the given prefix.
bool startsWith(string word) {
TrieNode *tempRoot=root;
int i;
for(i=0;i<word.length();i++)
{
if(tempRoot->next[word[i]-'a']!=NULL) tempRoot=tempRoot->next[word[i]-'a'];
else return false;
}
return true;
}
private:
TrieNode* root;
};