C语言实现KMP

void computeNext(string pat, int patLenth, int* next) {
	int len = 0;
	int i = 1;
	next[0] = 0;  

	//pat[i] 与 pat[len] 比 
	// i      1 2 3 4 5 6   7	8	  9 
	//pat	a b c d a b c   a	b	  a 
	//next	0 0 0 0 1 2 3   1	2	  1
	//len   0		1 2 3 0 1	2	0 1
	while (i < patLenth) {
		//pat从1开始遍历,与pat[len]相等否?
		if (pat[i] == pat[len]) { //相等
			len++; //len自加
			next[i] = len; //next[i]与len同
			i++; //i往后遍历
		}
		else { //不等
			if (len != 0) { //且len不为0
				len = next[len - 1]; //len改值为next的第len个数 重新比较
			}
			else { //且len为0
				next[i] = 0; //next[i]赋值为0
				i++; //i往后遍历
			}
		}
	}
}

void KMPSearch(string pat, string txt) {
	int patLenth = pat.length();
	int txtLenth = txt.length();

	int* next = (int*)malloc(patLenth * sizeof(int));
	int j = 0;  // index for pat[]

	computeNext(pat, patLenth, next);

	int i = 0;  // index for txt[]
	while (i < txtLenth) {
		if (pat[j] == txt[i]) {
			j++;
			i++;
		}

		if (j == patLenth) {
			printf("Found pattern at index %d \n", i - j);
			j = next[j - 1];
			break;
		}

		else if (i < txtLenth && pat[j] != txt[i]) {
			if (j != 0)//后面的不匹配
				j = next[j - 1]; // j 从 next数组的第j个对应的数重新开始
			else//第一个不匹配
				i = i + 1; // txt往后遍历
		}
	}
	free(next);    
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值