算法导论之KMP

#include <iostream>
#include <string>

using namespace std;

void makeNext(const string pattern, int *next) {
	int k, q;
	int m = pattern.length();
	next[0] = 0;
	for (k = 0, q = 1; q < m; ++q) {
		while (k > 0 && pattern[q] != pattern[k]) k = next[k - 1];
		if (pattern[q] == pattern[k]) k++;

		next[q] = k;
	}
}
//如果需要查出所有的包含pattern的位置,则使用void的函数,
//如果只要一个可以采用int返回index
void KMP(const string str, const string pattern) {
	int lenPattern = pattern.length();
	int lenStr = str.length();
	int * next = new int[lenPattern]();

	makeNext(pattern, next);
	cout << "最长前后缀相同表:" << endl;
	for (int i = 0; i < lenPattern; i++) cout << next[i] << " ";
	cout << endl;


	for (int i = 0, q = 0; i < lenStr; i++) {
		while (q > 0 && pattern[q] != str[i]) q = next[q - 1];
		if (pattern[q] == str[i]) q++;
		if (q == lenPattern) {
			cout << "找到一个匹配的字符串,其偏移量为:" << i - q + 1 << endl;
			q = next[q - 1];
		}
	}

	if (next != nullptr) {
		delete[] next;
		next = nullptr;
	}

}
int main() {
	string str = "ababxbabaabcdabdbcadfdsss";
	string pattern = "abcdabd";
	KMP(str, pattern);
	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值