0x15 字符串

一.字符串的基本知识
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. 周期 (求循环节)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值