今天重点学了学字符串,算是为以前的字符串恐惧症填坑(想想一个KMP都背不熟的lz)
KMP很简单,主要是维护p数组(定义:在一个字符串里,1~p[i]这个串和i-p[i]+1~i这个串相等)对于字符串的匹配问题(求子串、公共前(后)缀)很常用,也是很基础的算法了。
有一道简单的KMP题:caioj1457
很多人秒切但是你知道为甚这样套公式就行了吗?
定理:假设S的长度为len,则S存在循环子串,当且仅当,len%(len-p[len])==0,最短循环子串为S[len-p[len]]
例子证明:
设S=q1q2q3q4q5q6q7q8,并设p[8]=6,
此时str=S[len-p[len]]=q1q2,
由p的定义可知,q1q2q3q4q5q6=q3q4q5q6q7q8,
即有q1q2=q3q4,q3q4=q5q6,q5q6=q7q8,
即q1q2为循环子串,且易知为最短循环子串。
由以上过程可知,若len%(len-p[len])==0,则S存在循环子串,否则不存在。
对于KMP两串或多串匹配大佬肯定没什么问题了。
时间: 2024-10-24 11:14:34