字符串匹配算法---BF及KMP

字符串匹配的一般算法(BF

    以 ABSABABCEF 与 ABCE 为例,求串2与串1匹配的第一个位置的下标(这里即输出 5),一般的,我们可以从串1的起始位置开始与串2比较,若相同则两串都向后移,否则,串1回到第二个位置,串2回到起始位置重新比较。

字符串匹配算法---BF及KMP_第1张图片

代码:(以hdu1771为例)

本题用此方法会超时

#include
int a[10001],b[10001];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int m,n;
        scanf("%d%d",&n,&m);
        for(int i=0;i

字符串匹配KMP算法

   从上面一般算法中我们可以看到两字符串需要不断地回溯,这会导致复杂度增加,复杂度为O(M*N),再M,N过大的情况下会超时,因此有了KMP算法。

字符串匹配算法---BF及KMP_第2张图片

图1 

 从上图中可以看出我们不必让串1回溯,串2也不必每次都回溯到起始位置,那么我们怎么判断让串2回溯到什么位置你呢?这里引入字符串前缀和后缀的最长匹配长度,用pmt数组保存,为了方便我们再使用Next数组。

 

字符串匹配算法---BF及KMP_第3张图片

 

图2.

 如图一所示,比较至8的位置开始不相同,那么8之前的7个元素都是相同的,那么由前图2可知长度为7的字符串的前缀和后缀的最长匹配长度为3,所以我们可以知道串2只需要回退到pmt[7-1]的位置,即Next[7]的位置,所以我们用此方法来解决这道题。

AC代码(都以hdu1711为例)

#include
int a[1000001],b[10001],Next[100001];    //求Next数组
void getNext(int m)
{
    int i=0,j=-1;
    Next[0]=-1;
    while(i

题1711博客地址:https://blog.csdn.net/Krismile_/article/details/82814151

你可能感兴趣的:(KMP)