KMP算法

#include <bits/stdc++.h>
using namespace std;
void get_next(char T[], int *next)
{
	int i = 1, j = 0;
	next[1] = 0;
	while (i < T[0])//T[0]存放的是该字符串的长度,具体字符从T[1]开始
	{
		if (j == 0 || T[i] == T[j])//推到next数组
		{
			i++;
			j++;
			next[i] = j;
		}
		else
			j = next[j];
	}
}
void get_nextval(char T[], int *next)//对next数组进行改进
{
	int i = 1, j = 0;
	next[1] = 0;
	while (i < T[0])
	{
		if (j == 0 || T[i] == T[j])
		{
			i++;
			j++;
			if (T[i] != T[j])//遇到不同的才继续向前
				next[i] = j;
			else//遇到相同的则保存与之前相同的
				next[i] = next[j];
		}
		else
			j = next[j];
	}
}
int Index_KMP(char S[], char T[], int pos)
{
	int i = pos;
	int j = 1;
	int next[255];
	get_nextval(T, next);
	while (i <= S[0] && j <= T[0])
	{
		if (j == 0 || S[i] == T[j])
			i++, j++;
		else
			j = next[j];
	}
	if (j > T[0])
		return i - T[0];
	else return -1;
}

int main()
{
	char S[255], T[255];
	strcpy(S + 1, "AAAABCDEF");//主串 S
	S[0] = strlen(S + 1);
	strcpy(T + 1, "AB");//匹配子串 T
	T[0] = strlen(T + 1);
	printf("%d\n",Index_KMP(S, T, 1));

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值