以下是构造banana\0的后缀树:
具体代码如下:
#include <iostream>
#include <list>
#define MAX_CHAR 256
using namespace std;
class SuffixTrieNode{
private:
SuffixTrieNode *children[MAX_CHAR];
list<int> *indexes;
public:
SuffixTrieNode(){
indexes = new list<int>;
for(int i = 0; i < MAX_CHAR; ++i)
children[i] = NULL;
}
void insertSuffix(string suffix, int index);
list<int>* search(string pat);
};
class SuffixTrie{
private:
SuffixTrieNode root;
public:
SuffixTrie(string txt){
for(int i = 0; i < txt.length(); ++i)
root.insertSuffix(txt.substr(i), i);
};
void search(string pat);
};
void SuffixTrieNode::insertSuffix(string suffix, int index){
indexes->push_front(index);
if(suffix.length() > 0){
char cIndex = suffix.at(0);
if(children[cIndex] == NULL)
children[cIndex] = new SuffixTrieNode();
children[cIndex]->insertSuffix(suffix.substr(1), index + 1);
}
}
list<int>* SuffixTrieNode::search(string pat){
if(pat.length() == 0)
return indexes;
if(children[pat.at(0)] != NULL)
return children[pat.at(0)]->search(pat.substr(1));
else
return NULL;
}
void SuffixTrie::search(string pat){
list<int>* result = root.search(pat);
if(result == NULL)
cout<<"Pattern not found!"<<endl;
else{
int patLen = pat.length();
for(list<int>::iterator it = result->begin(); it != result->end(); ++it)
cout<<"Pattern found at position "<<*it - patLen<<endl;
}
}
int main() {
//freopen("input.txt","r",stdin);
//freopen("output.txt", "w", stdout);
string txt = "geeksforgeeks.org";
SuffixTrie S(txt);
cout << "Search for 'ee'" << endl;
S.search("ee");
cout << "\nSearch for 'geek'" << endl;
S.search("geek");
cout << "\nSearch for 'quiz'" << endl;
S.search("quiz");
cout << "\nSearch for 'forgeeks'" << endl;
S.search("forgeeks");
return 0;
}
转载于:http://www.geeksforgeeks.org/pattern-searching-using-trie-suffixes/