串的模式匹配KMP算法C/C++代码实现

KMP算法是字符串匹配算法的一种,通过next数组避免回溯,提高效率。本文介绍了KMP算法的思想,next数组的计算,并提供了C/C++代码实现,展示了运行结果。
摘要由CSDN通过智能技术生成

KMP算法思想:

KMP算法是对BF算法的改进,关键在不需回溯主串的i指针,且根据next数组的值移动子串的j指针。

匹配过程中匹配成功, 则i和j分别增1,否则,i不变, 而j退到next[j]的位置再比较,若相等, 则指针各自增1, 否则j再退到下一个next值的置,依次类推,直至下列两种可能:一种是j退到某个next值时字符比较相等,则指针各自增1, 继续进行匹配;另一种是j退到值为零(即模式的第一个字 符 "失配"),则此时需将模式继续向右滑动一个位置
在这里插入图片描述
在这里插入图片描述

next数组:

计算next值有两种方法:
第一种是根据前一位的next值,逐个比较是否相等(后面代码用此种方法)

第二种是求第n位时,比较前n-1位得出最长前后缀的匹配长度k,
则第n位的next值位k+1。(适用于手算做题)

nextval数组:

此数组是next的修正,弥补next数组有时的缺陷:例如模式"aaaab"在和主串"aaabaaaab"匹配时,当 i= 4、j= 4 时s.ch[ 4]不等于t.ch [ 4] , 由next(j)的指示还需进行 i= 4、j= 3, i= 4、j= 2, i= 4、j=1这3次比较。
计算nextval值有两种方法:
第一种是不依赖next数组值直接用观察法求得(见下面代码)
第二种是根据next数组值进行推理,比较。
在这里插入图片描述

代码如下:

#include<stdio.h>

#define MAXLEN 255

//串的顺序存储
typedef struct
{
   
	char ch[MAXLEN + 1];	//0号不用,从1开始
	int length;				//串的当前长度
}SString;
int next[MAXLEN];			//next数组
int nextval[MAXLEN];			//next修正数组

//KMP算法
//返回模式T在主串s中第pos个字符开始第一次出现的位置。若不存在, 则返回值为0 
int Index_KMP(SString S, SString T, int pos)
{
   
	int i = pos;	//主串起始位置
	int j = 1;		//模式串起始位置

	while (i<=S.length && j
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值