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

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


本文地址: http://blog.csdn.net/caroline_wendy


给你一个长字符串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 




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElminsterAumar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值