大一的我对kmp算法求next数组的理解

#include<iostream>
#include<vector>
#include<string>
using namespace std;
	void getnext(string arr,int* next)//传输模式串
	{
		int i, j=0;//i是后缀,j是前缀,j的意义是j前最长相等前缀长度
		           //j放在前缀的开始是为什么:字符串的前缀有一层递进关系,只有最前的前缀相等,它后缀才能够相等
		           //
		for (i = 1; i < arr.size(); i++)
		{
			while (j > 0 && arr[i] != arr[j])
			{
				j = next[j - 1];//kmp算法本质:不相等就找前一个next的下标。
			}
			if (arr[i] == arr[j])
			{
				j++;
			}
			next[i] = j;
		}
		//老实说这kmp算法求next这一部有种动态规划的味道,其状态的决定有两种1.匹配直接在next上加1,2.不匹配直接回到原先匹配位置并且读取其下标加1(不为首元素)。
	}
	/*
	* 前缀:
	* a aa aab aaba aabaa
	* 后缀:
	* f af aaf baaf abaaf
	* 
	*/
int main()
{
	string arr = "aabaabaaf";
	string arr1 = "aabaaf";
	int next[100];
	memset(next, 0, sizeof(int) * 100);
	getnext(arr1, next);
	//next求出来是01012
	return 0;

kmp算法其实就是充分利用自己已经遍历过的内容,暴力的时间复杂度是O(n*m),n为文本串长度,m为模式串长度,kmp算法就是将m的时间复杂度变为动态规划的时间复杂度。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值