首页 > 编程语言 >KMP算法

KMP算法

时间:2023-04-17 23:04:21浏览次数:31  
标签:子串 字符 缀集 前缀 int next 算法 KMP

KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。

这里面的前缀集表示除去最后一个字符后的前面的所有子串集合,同理后缀集指的的是除去第一个字符后的后面的子串组成的集合。举例说明如下:

在“aba”中,前缀集就是除掉最后一个字符'a'后的子串集合{a,ab},同理后缀集为除掉最前一个字符a后的子串集合{a,ba},那么两者最长的重复子串就是a,k=1;

在“ababa”中,前缀集是{a,ab,aba,abab},后缀集是{a,ba,aba,baba},二者最长重复子串是aba,k=3;

在“abcabcdabc”中,前缀集是{a,ab,abc,abca,abcab,abcabc,abcabcd,abcabcda,abcabcdab},后缀集是{c,bc,abc,dabc,cdabc,bcdabc,abcdabc,cabcdabc,bcabcdabc},二者最长重复的子串是“abc”,k=3; 

KMP算法_kmp

KMP算法_后缀_02

这里的p[j]==p[k],实际上就是指的从j=0开始,前缀与后缀相等的情况,一旦相等或k==-1,j&k同时加1,指向下一个元素,如果还相等,前缀与后缀依旧相等,next[j]也会随k增加而增加(j只增加而不会减少,而k在前缀与后缀不相等情况下会回溯,在if语句中k从0开始,满足条件逐步增加)

int KmpSearch(char* s, char* p)  
{  
    int i = 0;  
    int j = 0;  
    int sLen = strlen(s);  
    int pLen = strlen(p);  
    while (i < sLen && j < pLen)  
    {  
        //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++      
        if (j == -1 || s[i] == p[j])  
        {  
            i++;  
            j++;  
        }  
        else  
        {  
            //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]      
            //next[j]即为j所对应的next值        
            j = next[j];  
        }  
    }  
    if (j == pLen)  
        return i - j;  
    else  
        return -1;  
}  

标签:子串,字符,缀集,前缀,int,next,算法,KMP
From: https://blog.51cto.com/u_16030624/6196389

相关文章

  • 实验一 密码引擎-4-国䀄算法交叉测试
     实验一密码引擎-4-国䀄算法交叉测试 任务详情02人一组,创建一个文件,文件名为小组成员学号,内容为小组成员学号和姓名1在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码和运行结果截图2在Ubuntu中基于OpenSSL产生一对公私钥对(SM2算法)3在Ubuntu中......
  • 讲课:拓扑排序、最短路算法
    什么是图?把图在计算机中表示(储存)拓扑排序度与一个顶点v关联的边的条数称作该顶点的度(degree)在有向图G=(V,E)中,以一个顶点v为起点的边的条数称为该顶点的出度(out-degree),以一个顶点v为终点的边的条数称为该节点的入度(in-degree)思路首先记录各......
  • 实验一 密码引擎-4-国䀄算法交叉测试
    实验一密码引擎-4-国䀄算法交叉测试小组成员:20201316陈鑫20201332杨赛一、在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码和运行结果截图(代码见附件)1.生成待加密文件2.使用OpenSSL用SM4算法加密文件生成密文密钥为0123456789012343.密文4.mak......
  • 基于免疫遗传优化的图像分割算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:  2.算法涉及理论知识概要      人工免疫算法(ImmuneAlgorithm)是一种具有生成+检测(generateandtest)的迭代过程的群智能搜索算法。从理论上分析,迭代过程中,在保留上一代最佳个体的前提下,免疫算法是全局收敛的。算法主要......
  • 基于粒子群算法的电力系统最优潮流 以IEEE30节点的六机为对象,建立考虑功率平衡
    基于粒子群算法的电力系统最优潮流 以IEEE30节点的六机为对象,建立考虑功率平衡、机组爬坡约束、出力限制约束的电力系统经济调度模型,采用粒子群算法对模型进行求解,得到六个机组的最优运行计划,确定系统最优运行成本。YID:9650668667994429......
  • MD500E代码 包含pmsm的foc控制算法,电阻、电感、磁链等参数的辩识算法,死区补偿算法过调
    MD500E代码方案和解析文档+原理图+送仿真资料。资料最全,全新全新全新全新包含pmsm的foc控制算法,电阻、电感、磁链等参数的辩识算法,死区补偿算法过调制处理算法,弱磁控制算法,无感FOC控制算法,电流环自整定算法,磁链观测器算法。ID:8245670260640972......
  • 基于粒子群算法的综合能源优化问题 建立包含冷热电气的综合能源系统,以综合能源运行成
    基于粒子群算法的综合能源优化问题建立包含冷热电气的综合能源系统,以综合能源运行成本最优为目标,建立优化运行模型采用粒子群算法进行优化求解得到各个冷热电设备的最优运行计划里面包含一篇参考的资料代码和资料基本差不多ID:7750672838465384......
  • 基于遗传算法的最优潮流 以IEEE30节点的输电网为研究对象 以系统发电成本最小为目标函
    基于遗传算法的最优潮流 以IEEE30节点的输电网为研究对象以系统发电成本最小为目标函数以机组出力为优化变量其中出力与成本的关系是经典的二次函数关系 通过优化求解得到最佳机组出力ID:2550672838253871......
  • 基于IEEE33节点的配电网重构,采用最优流法(和粒子群算法)开展了配电网重构工作
    基于IEEE33节点的配电网重构,采用最优流法(和粒子群算法)开展了配电网重构工作,得到重构方案,应打开的开关数等,同时对比了重构前后的网损和电压结果ID:3750673165858206......
  • 算法笔记
    小知识指针常量和常量指针http://t.csdn.cn/oRx9S基础算法排序排序的时间复杂度快速排序快速排序思想:分治流程:1.确定分界点:q[l]q[l]q[l]、q[(l+r)/2]q[(l+r)/2]q[(l+r)/2]、q[r]q[r]q[r]、随机点,记值为x2.调整区间为,分界点左边的数都<=x,分界点右边......