KMP next 数组讲解

KMP next 数组讲解

重点在于匹配不上回退的理解

在这里插入图片描述

最后粉色的讲解,笔者感觉是理解回退的关键。

好像有点不清楚,上传的图片。

C 语言版本代码:

吐槽几句:
写吐了,代码就几句,写了好久,一直在百度C语法,C语言忘光了。

Java写习惯了,感觉 C 是真的简陋啊,要啥,啥没有。

1 数组长度需要自己计算。

2 数组长度必须为常量,要实现 int a[n] 还要通过指针和malloc实现,然后实现出来的东西,还不能再求出它长度了,,,。

感觉像现代人回到了原始社会。。犹记当时大一会,我还是 C语言 课代表呢,C语言写的也是可以的啊,4,5年下来全还给老师了。

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

#define ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0]))

typedef struct {
	char data[50];
	int length;
}string;

void GetNext(string pattern,int* next) {
	int j = 0; // 下标 从 0  开始。
	int k = -1; // k 表示 最大公共前后缀长度,从 -1 开始 。
	next[0] = k;

	// 遍历 到 倒数第二位。因为每次遍历得到的值,是下一个下标的数组值。
	// 下标0的数组值,在遍历之前就默认了。遍历第一轮是给下标1的数组单元赋值。
	// 所以遍历到倒数第二位就好了。
	while (j < pattern.length-1) {  
		// k == -1 .既是为了设置 next[1] = 0 ; 
		// 也是为了最后回退,一直不匹配,t[0]和t[j] 作比较
		// 此时 k = 0  回退以后 k == -1 ,再次进入 if 条件设置 next[j] = 0 ;
		if (-1 == k || pattern.data[k] == pattern.data[j]) {
			k++;
			j++;
			next[j] = k;
		}
		else {
			k = next[k];
		}
	}
}

void MyPrint(int array[],int length) {
	for (int i = 0; i < length;i++) {
		printf("%d ", array[i]);
	}
}

int main() {
	char *temp = "aaababccacade";
	string pattern;

	for (int i = 0; '\0' != temp[i];i++) {
		pattern.data[i] = temp[i];
		pattern.length = i+1;
	}

	int length = sizeof(int)*pattern.length;
	int* const next = (int*)malloc(length);
	GetNext(pattern,next);
	MyPrint(next,pattern.length);



	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值