您的位置:首页 > 其它

KMP算法

2015-11-16 23:04 295 查看
KMP算法是字符串模式匹配的一个改进的算法,此算法可以 在O(m+n)的时间数量级上完成串的模式匹配操作。其主要是求next[]数组。看了好多文章,说的不是很清楚,也不是很好理解。在这里写上我自己的一个看法。我的这个见解只为了很快求出next[]数组,至于具体的代码实现,还是用经典的代码实现。

KMP算法的思想是当主串中的第i个字符与模式中的第j个字符“失配“(即比较不相等)时,主串中的第i个字符(i不回溯,当然是可以往前加1的)应与模式中的哪个字符比较。(这个可以先不理解,看完就懂啦)

举个例子:

j12345678
模式串abaabcac
next[j]01122312
next[j]就是找到p1p2......pj-1这个串中”最长的对称的字符串“。我是加引号的啊,不一定是你想的对称啊!

个人思想:

next[1]为0,next[2]为1,这是不用再算的,也是一定的。我们也没有必要再费心去算。我们从第三个开始。

aba: 其前缀字符串是ab.我们所说的最长的对称子字符串是指这样的对称。如:ab ab 。而不是类似这样的对称,

ab ab a。对,我想表达的意思就是第一个字符串中必须含有第一个字符,第二个字符串中必须含有最后一个字符。所以ab的最长的对称的字符串是0,所以我们的next[3]=0+1=1,对就是最长字符串加1。至于为什么是这样,我想表达一下,却发现很难用语言来说明(原谅我吧)

abaa:其前缀字符串是aba,按我们所说的对称标准,其最长的对称字符串的长度是1,所以其next[4]=1+1=2。

abaab:其前缀字符串是abaa,其最长的对称字符串长度也是1,所以其next[5]=1+1=2;

abaabc:其前缀字符串是abaab,其最长的对称字符串是前后的ab,所以其长度是2,所以next[6]=2+1=3;

abaabca:其前缀字符串是abaabc,是没有我们所说的对称的,所以是0,所以next[7]=0+1=1.注意:这里的p1p2=ab,p4p5=ab,这两个字符串不是我们所要的对称字符串。因为第二个字符串没有包含p6,即pj-1这个字符。

。。。。。。。。。。。。。

这个方法,做了牛客网上的几道题,亲测还是可以用的。是正确的。其实这样做是有理论依据的。也是符合那个其next[j]的公式的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: