字符串之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