一.字符串的基本知识
1.字符串:
1.1 S:无特殊说明,字符串仅由26个小写字母'a'~'z'构成,并用大写字母表示一个字符串。
1.2 |S|:表示一个字符串的长度。
1.3 S[i]:表示字符串S的第i个位置的字母,下标从1开始。
2.子串:
2.1 S[l,r]:表示字符串S从l到r个字母顺次连接而成的新的字符串。
2.2 PrefixS[i]:表示字符串S长度为i的前缀,PrefixS[i]=S[1,i];
2.3 SuffixS[i]:表示字符串S长度为i的后缀,SuffixS[i]=S[|S|-i+1,|S|]
3.Border:
如果字符串S的相同长度的前缀和后缀完全相同,即Prefix[i]=Suffix[i]
则称此前缀(后缀)为一个Border(一般Border也指长度)
PS:字符串本身也可以是它的Border,具体是不是要根据语境判断。
例子:若S=bbabbab,求所有Border
ans: b
bbab
有一个长度为1,一个长度为4的Border。
4.周期和循环节:
周期:对于字符串S和正整数p,如果有S[i]=S[i-p],对于p<i<=|S|成立,则称p为字符串S的一个周期。
PS:p=|S|一定是S的周期。
不要求最后一个循环单元完整。
S=bbabbab
周期:p=3时 bba bba b 最后一个不完整
p=6时 bbabba b 最后一个不完整
p=7时 bbabbab 完整(自己是自己的周期)
循环节:循环节则要求最后一个循环单元也是完整的。
本身一定是本身的循环节。
S=bbabbab
循环节:
p=7时 bbabbab 完整(自己是自己的循环节)
重要性质:
重要性质:
Border和周期
1.p是S的周期<=>|S|-p是S的Border
证明:
p为S的周期<=>S[i-p]=S[i];
q为S的Border<=>S[1,q]=S[|S|-q+1,|S|]<=>S[1]=S[|S|-q+1],S[2]=S[|S|-q+2]…S[q]=S[|S|];
易得S[i]=S[i+|S|-q];
->p+q=|S|
因此,字符串的周期性质等价于Border的性质。
求周期也等价于求Border。
PS.
1.Border不具有二分性。
2.%操作常数大。
Border的性质:
1.传递性:S的Border的Border也是S的Border。
故求S的所有Border等价于求所有前缀的最大Border。
KMP算法
又称模式匹配算法,能够在线性时间内判断字符串A[1~N]是否为字符串B[1 ~M]的字串,并求出字符串A在字符串B中各次出现的位置。
三.例题
AcWing 141. 周期 (求循环节)