KMP字符串匹配算法的解析及记忆

KMP字符串匹配算法的解析及记忆


void kmp_pre(char x[],int m,int fail[])
{//x是字符子串数组,也就是模式串,m是总长度
    int i,j;
    j = fail[0] = -1;//这个一定要初始化的
    i = 0;
//首先要明确一点,无论x[i]等不等于x[j],i是在不断前进的,也就是说子串每一个字符都有对应的fail序号
(也就是查找失败后返回与子串前缀相同的最大长度)举个例子:
假如子串abaabcac,
母串为  abaabaabcac...
那么查找到第6个位置发现不匹配,令j=fail[6]=2(子串第六个位置前面与前缀最大的公共相同序列为ab,所以最大长度为2=fail[6]),
所以下一次匹配就从j=2+1=3 子串的第三个位置开始对比,即母串的第6个位置直接与子串的第3个位置对比,也就是
aba(ab)aabcac...
   (ab)aabcac这样子进行对比。
所以以下过程就是求子串各个字符对应的与前缀的最大公共序列字符数
    while (i < m)
    {
        while (j != -1 && x[i] != x[j]) j = fail[j];
        fail[++i] = ++j;
    }//
//举个例子:abcabc求fail数组
//f[1]=0,x[1]!=x[0],j=f[0]=-1;f[2]=0;x[2]!=x[0];j=f[0]=-1;f[3]=f[0];
//x[3]=x[0],f[4]=1;x[4]=x[1],f[5]=2;x[5]=x[2],f[6]=3;
}

int kmp_count(char x[],int m,char y[],int n)//这个查找还比较好理解
{
    int i = 0,j = 0;
    int ans = 0;
    while (i < n)
    {
        while (j != -1 && y[i] != x[j]) j = fail[j];//与上面是不是很类似?直接看上面例子吧,比较好理解
      i++;j++; //得到最大公共序列字符数之后还要+1,因为要从不相同的一个字符开始对比              
        if (j >= m)
        {
            ans++;
            j = fail[j];
        }
    }
    return ans;
}


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值