kmp算法(查找字符串在长字符串中首次出现的位置)

kmp查找关键的地方首先是在next数组的创建

next数组创建:abababac为例

next数组第一位str[0]为next[0]=0,str[1]和str[0]不相同所以也为next[1]=0,str[2]动态规划先和str[1]比较,不相同,则比较str[1-1],相同故next[2]=1,str[3]和str[next[1]+1]比较相等则next[3]=next[2]+1=2,str[4]和str[next[2]+1]比较相等故next[4]=next[3]+1=3,next[5],next[6],next[7],同理各自加一,str[8]也就是str[next[7]+1]作比较,发现不相等则开始往前一位比较相等就加next就在前一位的基础上加一,不相等就继续往前。

下面上代码

void GetNext(char s[],int next[])
{
    int len = strlen(s);
    next[0]=0;                    //初始化next数组
    for(int i=1,k=0;i<len;i++)
    {
        while(k>0 && s[k]!=s[i])  //这个while是最关键的部分
            k=next[k-1]; 
            //等价于  k=next[next[i-1]-1]
            //等号右边的k起的只是下标的作用
        if(s[k]==s[i])            
            k+

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值