C语言程序设计代码树,编程算法 - 后缀树(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

#include

#include

using namespace std;

class SuffixTreeNode {

map children;

char value;

vector 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 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 empty;

return empty;

}

}

}

~SuffixTreeNode() {

map::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

string suffix = s.substr(i);

root->insertString(suffix,i);

}

}

vector 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 li = tree.getIndexes(stringList[i]);

if (li.size() != 0) {

cout << stringList[i] << "  ";

for (int j=0; j

cout << li[j] << " ";

cout << endl;

}

}

return 0;

}

输出:

is  1 4

sip  6

sis  3

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值