字符串之KMP算法

字符串之KMP算法

在字符串匹配的问题中,我们首先想到的就是暴力,将字串和母串一一进行匹配,借此来找到母串中是否包含有字串

,但是当母串非常长而且字串在母串的靠后一部分的时候,就很容易TLE,因此就引出了KMP算法,此算法可以利用之前进行匹配时候得到的信息

来影响下一次匹配。然后我们开始学习KMP

第一步了解KMP算法:https://blog.csdn.net/v_july_v/article/details/7041827

然后写下个人自己的一些理解。

①为什么KMP可以见减少时间复杂度

在普通的暴力算法中,一旦我们遇到了不匹配的时候(a[i]!=b[j]),我们就会重新开始a[i-j+1],b[0]这样势必会照成时间上的浪费。KMP算法中一个比较重要的概念就是

最长相同前缀后缀,此算法也是借此来使时间得到优化的

比如说母串为:a[]=ABCABDDAD;

           字串为:b[]=ABCABC;

当我们匹配完ABCAB都和母串相同但是下一位C却和D不相同,观察C前面(ABCAB)有相同前缀后AB,我们可以直接从前面的C处开始进行匹配,因为母串的a[3-4]可以和子字串的b[0-1]进行匹配

②next数组的理解 next数组主要是为字串的移动进行一个对照,在整个算法中十分重要

void getnext()
{
    int len=strlen(s);
    int i=0,j=-1;
    next[i]=j;
    while(i<len)
    {
        while(j!=-1&&s[i]!=s[j])  j=next[j];
        next[++i]=++j;
    }

}//求解next数组

——————————————————分隔符————————————————————————————————

习题:https://blog.csdn.net/guhaiteng/article/details/52108690

猜你喜欢

转载自www.cnblogs.com/tombraider-shadow/p/11208015.html