KMP算法

##**KMP算法(C语言实现)
**此次KMP算法的实现离不开印度三哥的教学,资源在b站av3246487
在他的KMP算法的思想中,建立临时数组,next,有助于更好地利用前缀和后缀相同
从而减少比较量

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void KMP(char a[], char b[]);

void main(){

	char a[80];
	char b[10];
	printf("请输入主串:");
	gets_s(a);
	printf("\n请输入子串:");
	gets_s(b);
	KMP(a, b);
}

void KMP(char a[], char b[]) {
	int i,j,t,m;
	t = strlen(b);
	int c[80];
	int d[20];

	c[0] = 0;
	for (i = 0, j = 1;;) {//建立临时数组,为c

		if (j == strlen(b)) {//当j到尽头时,就会让i通过查找临时数组的前一个单元存储的元素为i的下一个位置

			if (i == 0) {
				break;
			}

			i = c[i - 1];
			if (b[i] == b[j]) {
				c[j] = i + 1;
				break;
			}
		}
		else{
			if (b[i] != b[j]) {//当找到两个相同的的时候,i和j同时向后移
			c[j] = 0;
			j++;
			}
			else {//不相同时,j后移,i不变
			c[j] = i + 1;
			i++;
			j++;
			}
		}	
	}//到这里我已经知道了数组c里存的是什么玩意儿啦,存的就是特殊的临时数组

	for (i = 0, j = 0, t = 0; ; ) {//进行主串和子串之间的判断,找到不相同的时候再参考临时数组,找到主串中的元素应于子串中的第几个进行比较
		if (a[i] == b[j]) {

			if (j == strlen(b)) {//找到相同的
				t = i - strlen(b)+1;
				break;
			}
			j++;
			i++;
		}	
		else
			i++;
		
		if(a[i] != b[j] && j >= 2) {//只有长度大于2才有可能出现相同的前缀和后缀,也就才可以改变j的值
			m = c[j - 1];
			j = c[m];
		}
	}

	printf("位置如下:");
	printf("%d", t);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值