算法学习07-数据结构02:KMP算法(字符串匹配)

本文详细介绍了KMP算法,包括求解next数组的原理以及匹配过程的实现,通过代码示例展示了如何在模式串中使用KMP算法高效查找子串。
摘要由CSDN通过智能技术生成

算法学习07:KMP算法(字符串匹配)



前言

在这里插入图片描述



要记忆的模版:

// 求next数组的过程:(还是不太明白为什么可以求出来!!!)
// j:表示匹配成功的位数 
for(int i = 2, j = 0; i <= n; i ++)
{
	// 推无可退、下一位匹配成功 
	while(j && p[i] != p[j + 1]) j = ne[j];
	if(p[i] == p[j + 1]) j ++;
	ne[i] = j;
 } 
 
	// kmp 匹配过程:
 for(int i = 1, j = 0; i <= m; i ++)
 {
 	while(j && s[i] != p[j + 1]) j = ne[j];
 	if(s[i] = p[j + 1]) j ++;
 	//匹配成功: 
 	if(j == n)
 	{
 		printf("%d", i - n + 1);
 		j = ne[j];//匹配成功,去寻找下一个子串 
	 }
  } 

提示:以下是本篇文章正文内容:

一、KMP算法

1.kmp匹配过程:

在这里插入图片描述



2.求解next数组(kmp算法重点)

在这里插入图片描述



3.代码

#include <iostream>

using namespace std;

const int N = 10000 + 10, m = 100000 + 10;

int n, m;
int p[N], s[N];//p:模版串, s:模式串 
int ne[N]; //ne:next数组,表示 最少前进几步,后缀和前缀可以匹配

int main()
{
	//s + 1:表示模式串 从索引1 开始 (看自己的习惯) 
	cin >> n >> p + 1 >> m >> s + 1;
	
	// 求next数组的过程:
	// j:表示匹配成功的位数 
	for(int i = 2, j = 0; i <= n; i ++)
	{
		// 推无可退、下一位匹配成功 
		while(j && p[i] != p[j + 1]) j = ne[j];
		if(p[i] == p[j + 1]) j ++;
		ne[i] = j;
	 } 
	 
	 // kmp 匹配过程:
	 for(int i = 1, j = 0; i <= m; i ++)
	 {
	 	while(j && s[i] != p[j + 1]) j = ne[j];
	 	if(s[i] = p[j + 1]) j ++;
	 	//匹配成功: 
	 	if(j == n)
	 	{
	 		printf("%d", i - n + 1);
	 		j = ne[j];//匹配成功,去寻找下一个子串 
		 }
	  } 
	return 0;
 } 

总结

提示:这里对文章进行总结:

💕💕💕

  • 29
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lennard-lhz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值