编程算法 - 后缀树(Suffix Tree) 代码(C)


后缀树(Suffix Tree) 代码(C) 

给你一个长字符串s与很多短字符串集合{T1,, T2, ...}, 设计一个方法在s中查询T1, T2, ..., 要求找出Ti在s中的位置.

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.7.20
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <vector>
#include <map>

using namespace std;

class SuffixTreeNode {
 map<char, SuffixTreeNode*> children;
 char value;
 vector<int> indexes;
public:
 SuffixTreeNode() {}
 void insertString(string s, int index) {
  indexes.push_back(index);
  if (s.length() > 0) {
   value = s[0];
   SuffixTreeNode* child = NULL;
   if (children.find(value) != children.end()) {
    child = children[value];
   } else {
    child = new SuffixTreeNode();
    children[value] = child;
   }
   string remainder = s.substr(1);
   child->insertString(remainder, index);
  }
 }

 vector<int> getIndexes(string s) {
  if (s.length() == 0)
   return indexes;
  else {
   char first = s[0];
   if (children.find(first) != children.end()) {
    string remainder = s.substr(1);
    return children[first]->getIndexes(remainder);
   } else {
    vector<int> empty;
    return empty;
   }
  }
 }

 ~SuffixTreeNode() {
  map<char, SuffixTreeNode*>::iterator it;
  for (it!=children.begin(); it!=children.end(); ++it)
   delete it->second;
 }
};

class SuffixTree {
 SuffixTreeNode* root;
public:
 SuffixTree(string s) {
  root = new SuffixTreeNode;
  for (int i=0; i<s.length(); ++i) {
   string suffix = s.substr(i);
   root->insertString(suffix,i);
  }
 }
 vector<int> getIndexes(string s) {
  return root->getIndexes(s);
 }

 ~SuffixTree() {}
};

int main(void)
{
 string testString = "mississippi";
 string stringList[] = {"is", "sip", "hi", "sis"};
 SuffixTree tree (testString);
 for (int i=0; i<4; i++) {
  vector<int> li = tree.getIndexes(stringList[i]);
  if (li.size() != 0) {
   cout << stringList[i] << "  ";
   for (int j=0; j<li.size(); ++j)
    cout << li[j] << " ";
   cout << endl;
  }
 }

 return 0;
}

输出:

is  1 4
sip  6
sis  3

本文永久更新链接地址:

相关内容