KMP算法

学习时间2022.12.11

KMP算法

基本概念

代码实现

暴力匹配算法

typedef char* SString;
//暴力匹配
int Index(SString S, SString T) {
	int i = 1, j = 1;
	while (i<=S[0]&&j<=T[0])
	{
		if (S[i] == T[j])
		{
			i++;
			j++;
		}
		else
		{
			i = i - j + 2;
			j = 1;
		}
	}
	if (j > T[0])
	{
		return i - T[0];
	}
	else
	{
		return 0;
	}
}

KMP算法

求next数组
//计算next数组
void Get_next(SString T, int next[]) {
	int i = 1;
	next[1] = 0;
	int j = 0;
	while (i < T[0])
	{
		if (j == 0 || T[i] == T[j])
		{
			++i;
			++j;
			next[i] = j;//记录出现重复的位置
		}
		else
		{
			j = next[j];
		}
	}
}
KMP
//KMP算法
int KMP(SString S, SString T, int next[]) {
	int i = 1, j = 1;
	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 0;
	}
}

main函数

int main() {
	//主串
	char S[256];
	//模式串
	char T[10];
	//next数组
	int next[10];
	int pos;
	S[0] = strlen("abcabaaabacbabc");
	strcpy(S + 1, "abcabaaabacbabc");
	T[0] = strlen("abacba");
	strcpy(T + 1, "abacba");
	pos = Index(S, T);
	printf("暴力匹配的结果:%d\n", pos);

	Get_next(T, next);
	for (int i = 1; i <= T[0];i++) {
		printf("%3d", next[i]);
	}
	printf("\n");
	pos = KMP(S, T, next);
	printf("KMP算法匹配的结果:%d\n", pos);
}
posted @ 2022-12-13 15:10  ayubene  阅读(17)  评论(0编辑  收藏  举报