KMP算法(从1开始时和从零开始两种)

复习的时候又看了以前写的文,然后真想一棍子打死自己。。。next数组居然还是char型http://t.csdn.cn/ubT0C,下面是刚修改的。

代码(从1开始时)

//数组第一个位置存储长度
int *getNext(char *a)
{
    int len = a[0];
    int *next= (int *)malloc(sizeof(int)*len);

    int k=0,j=1;
    next[1]=0;
    while(len>j)//j是当前检查元素的前缀的最后一个元素的下标
    {
        //如果a[j]==a[k]说明最大前后缀长度可以加一
        if(k==0||a[j]==a[k]) next[++j]=++k;//k初始值0是next[1]=0
        else k = next[k];//如果某一个位置不再匹配最大前后缀,则刚才的最大前后缀就断了,回去再匹配(注意这时j并不移位)
    }
}

int KMP(char *str,char *chapter)
{
    int *next = getNext(chapter);
    int len2 = chapter[0],len1 = str[0];
    int i=1,j=1;//i用来做str下标索引,j为next下标索引
    while(i

代码(从0开始时)

题目没什么要求就用这种吧,0开始的话就不用输入数据第一位是数字后面位是字符了,可以直接用C的string。

#include 
#include 
#include 

int *getNext(char *chapter)
{
    int len = (int)strlen(chapter);
    int i=-1,j=0;

    int *next = (int *)malloc(sizeof(int)*len);
    next[0]=-1;
    while(j

测试

28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)把代码放到力扣上试了试,准确运行。

KMP算法(从1开始时和从零开始两种)_第1张图片

你可能感兴趣的:(数据结构,期末复习,算法,c++,开发语言)