字符串匹配算法(KMP)

曾经学习过KMP算法,只依稀记得这是一种字符串的匹配算法,然而当时太菜,学得并不透彻。如今到了复习字符串的时候,就写一篇关于KMP的博客,给自己一个更深更透彻的理解。

问题背景

给定一个文本串S1,一个模式串S2(为什么叫这俩名字我也不知道),查找S2在S1中的对应位置。

暴力匹配

根据描述,很容易想到一个 n 2 n^2 n2的暴力:即 i i i表示S1匹配到 i i i号位置, j j j表示S2匹配到 j j j位置。如果S1[i]==S2[j], i ++, j ++, 若j = Len(S2) (根据下标使用,也可能是 − 1 -1 1),则匹配成功,反之 i = i − ( j − 1 ) , j = 0 i = i - (j - 1),j = 0 i=i(j1)j=0重新进行匹配。

根据这个思路,得到下列的代码:

	string S1, S2;
	cin >> S1 >> S2;
	int Len1 = S1.length(), Len2 = S2.length();
	LL i = 0, j = 0;
	while (i < Len1)
	{
		if (S1[i] == S2[j])
		{
		 	i ++, j ++;
		 	if (j == Len2 - 1)
			 	PP[++ tot] = i - j, i -= (j - 1), j = 0; 
		}
		else i -= (j - 1), j = 0;
	}

KMP

先转个博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值