扩展KMP算法(Extend KMP)

 更新时间:2014年08月21日 11:58:52   投稿:hebedich  
我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。今天我们谈到的是对KMP算法的拓展

扩展kmp既是求模式串和主串的每一个后缀的最长公共前缀

即令s[i]表示主串中以第i个位置为起始的后缀,则B[i]表示s[i]和模式串的最长公共前缀

显然KMP是求s[i]=模式串长度的情况,所以,扩展KMP是对KMP的拓展

像求KMP的next数组一样,我们先求A[i],表示模式串的后缀和模式串的最长公共前缀

然后再利用A[i]求出B[i]
说明一下A的求法,B同理
现在我们要求A[i],且A[1]---A[i-1]已经求出,设k,且1<=k<=i-1,并满足k+A[k]最大
所以T[k]--T[k+A[k]-1]=T[0]--T[A[k]-1],推出T[i]--T[k+A[k]-1]=T[i-k]--T[A[k]-1]
令L=A[i-k],若L+i-1<k+A[k]-1,由A是最长公共前缀知A[i]=L,否则,向后匹配,知道字符串失配
并相应更新k
时间复杂度为线性O(m+n)

while(1+j<strlen(T)&&T[0+j]==T[1+j])
        j = j + 1;
 A[1]=j;
    int k=1;
    for(int i=2; i<strlen(T); i++)
    {
        int Len = k + A[k] - 1,L = A[i-k];
        if( L < Len - i + 1 )
            A[i] = L;
        else
        {
            j = max(0,Len -i +1);
            while(i+j<strlen(T)&&T[i+j] == T[0+j])
                j = j + 1;
            A[i] = j,k = i;
        }
    }
    j = 0;
    while(j<strlen(S)&&j<strlen(T)&&T[0+j]==S[0+j])
        j = j + 1;
    B[0] = j,k = 0;
    for(int i=1; i<strlen(S); i++)
    {
        int Len = k + B[k] - 1,L = A[i-k];
        if( L < Len - i + 1 )
            B[i] = L;
        else
        {
            j = max(0,Len -i +1);
            while(i+j<strlen(S)&&j<strlen(T)&&S[i+j] == T[0+j])
                j = j + 1;
            B[i] = j,k = i;
        }
    }
 ps:普通的next是到这个结尾的,能和模式串匹配的长度,扩展kmp是以这个开头的能匹配的最大长度
pss:然后我简单比较了下kmp和扩展kmp http://www.isnowfy.com/kmp-and-extend-kmp/

相关文章

  • C语言异常处理机制案例讲解

    C语言异常处理机制案例讲解

    这篇文章主要介绍了C语言异常处理机制案例讲解,本文讲解了异常处理机制所用的函数和具体的代码实现等,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++小利器之std::bind参数绑定包装器的使用详解

    C++小利器之std::bind参数绑定包装器的使用详解

    从 C++11 开始,标准库提供了 std::bind 用于绑定函数 f 和调用参数,返回一个新可调用函数对象 fn,下面就跟随小编一起深入了解一下std::bind的具体使用吧
    2023-12-12
  • Visual C++中Tab View的多种实现方法

    Visual C++中Tab View的多种实现方法

    这篇文章主要介绍了Visual C++中Tab View的多种实现方法,包括了CTabCtrl控件、CSheetCtrl标签选择窗口以及静态分割窗口等实现Tab View的方法,需要的朋友可以参考下
    2014-10-10
  • C语言结构体定义的方法汇总

    C语言结构体定义的方法汇总

    结构体是一种工具,用这个工具可以定义自己的数据类型。下面通过本文给大家分享了C语言结构体定义的方法汇总,需要的朋友参考下吧
    2017-12-12
  • c++ error:crosses initialization of问题解决分析

    c++ error:crosses initialization of问题解决分析

    这篇文章主要介绍了c++ error:crosses initialization ofde 问题解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • C++算法之海量数据处理方法的总结分析

    C++算法之海量数据处理方法的总结分析

    本篇文章是对海量数据处理方法进行了详细的总结与分析,需要的朋友参考下
    2013-05-05
  • C++面向对象实现万年历的示例代码

    C++面向对象实现万年历的示例代码

    本文将通过面向对象实现一个简单的日历(万年历)效果,主要会有以下几个模块:模型、视图、控制,感兴趣的小伙伴可以动手尝试一下
    2022-06-06
  • c/c++ 标准库 bind 函数详解

    c/c++ 标准库 bind 函数详解

    bind是一组用于函数绑定的模板。在对某个函数进行绑定时,可以指定部分参数或全部参数,也可以不指定任何参数,还可以调整各个参数间的顺序。这篇文章主要介绍了c/c++ 标准库 bind 函数 ,需要的朋友可以参考下
    2018-09-09
  • OpenCV轮廓检测之boundingRect绘制矩形边框

    OpenCV轮廓检测之boundingRect绘制矩形边框

    在进行文本检测时,我们常常会用矩形边框将检测到的内容框除。这篇文章主要为大家介绍的是OpenCV中能实现这一效果的函数:boundingRect,感兴趣的同学可以学习一下
    2021-12-12
  • C++详细分析引用的使用及其底层原理

    C++详细分析引用的使用及其底层原理

    引用是C++一个很重要的特性,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价,这篇文章主要给大家总结介绍了C++中引用的相关知识点,需要的朋友可以参考下
    2022-04-04

最新评论