鱼C论坛

 找回密码
 立即注册
查看: 1757|回复: 4

有关kmp算法问题

[复制链接]
发表于 2022-7-9 21:58:11 | 显示全部楼层 |阅读模式
40鱼币
typedef struct
{       
        char data[MaxSize];
        int length;                        /
} SqString;

void GetNext(SqString t,int next[])               
{
        int j,k;
        j=0;k=-1;
        next[0]=-1;//第一个字符前无字符串,给值-1
        while (j<t.length-1)
       
        {       
                if (k==-1 || t.data[j]==t.data[k])         //k为-1或比较的字符相等时
                {       
                        j++;k++;
                        next[j]=k;
                        //这里k比j小1是因为相等前后缀+1等于出现错误的位置对吧?
               }
               else
                {
                        k=next[k];  //那这里为什么又用next[k]的值赋给k了?这样不是一下少了两位么?
                       
                }
        }
}
int KMPIndex(SqString s,SqString t)  //KMP算法
{

        int next[MaxSize],i=0,j=0;
        GetNext(t,next);
        while (i<s.length && j<t.length)
        {
                if (j==-1 || s.data[i]==t.data[j])
                {
                        i++;j++;                         
                }
                else j=next[j];                 //这里是怎么运用next数组的也没有用函数调用 就是j=next[j]; 怎么就把next数组用上了?
    }
    if (j>=t.length)
                return(i-t.length);         
    else  
                return(-1);                       
}

关于KMP算法它的思路我了解了,但是关于它的代码我没有看懂,它是怎么利用next数组找到相等前后缀的?又是怎么让字符串完成移动的?看不懂的地方写在代码的注释部分,麻烦大佬们帮我讲一讲&#128557;

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-7-9 22:00:17 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-7-9 22:56:34 | 显示全部楼层
大佬们快来呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-7-11 21:39:16 | 显示全部楼层
为啥kmp算法是定义i,j相同 而不是跟next数组一样i=1.j=0开始呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-18 08:41:12 | 显示全部楼层
建议去B站看看有关KMP的Next数组的求法,有手推算和代码哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 22:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表