【总结】【字符串】AC自动机&KMP算法

本文总结了AC自动机和KMP算法在字符串匹配中的应用。KMP算法适用于单模式串匹配,通过fail数组优化了匹配效率,达到O(n+m)的时间复杂度。AC自动机则扩展到多模式串匹配,将fail指针概念应用于Trie树,同样提供高效的匹配速度。文中列举了多个KMP和AC自动机的实际题目作为实例。
摘要由CSDN通过智能技术生成

前言:

AC自动机与KMP算法,都是用于优化字符串匹配的算法。
KMP算法应用于单模式串的匹配。
而AC自动机是应用于多模式串的匹配。

但并不意味着KMP算法可以被完全取代(尽管两者的算法思想本质上是一样的)。

KMP算法:

相对而言,KMP算法比较容易一些。

首先,考虑如何暴力匹配?很显然,可以以主串的任意一个位置开头,然后开始匹配,失配后,再找下一个位置开头。

这样的复杂度显然是O(n*m)的。非常低劣。

而KMP算法则是用于优化这个过程的。显然,每次重新匹配时,如果能利用之前匹配的信息,那么就会节约很多时间。这里就要引入fail数组。 f a i l i fail_i faili表示与前缀 i i i拥有相同后缀的,最靠后的位置。这样如果在i号位置失配,那么可以跳到其fail指针的位置,继续匹配。

这样做的复杂度很显然就是O(n+m)的。
板子:

void build(int x){
   
	int i=0,j=-1;
	fail[0]=-1;
	while(i<len[x]){
   
		if(j==-1||s1[x][i]==s1[x][j]){
   
			i++;
			j
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值