KMP算法 - next数组和nextval数组

本文详细介绍了如何使用C语言编写的KMP算法,包括计算模式串的next数组和nextval数组,用于字符串匹配和高效搜索。通过实例展示了get_next()和get_nextval()函数的使用,以及它们在模式串匹配过程中的作用。
摘要由CSDN通过智能技术生成

参考书籍

《数据结构》(C语言版  第2版)——  严蔚敏 李冬梅 吴伟民   编著

程序应用

给出模式串即可得出next数组和nextval数组

代码段

#include<iostream>
#include<cstring>
//需用到strlen()函数求模式串的长度 
using namespace std;

char pattern[99999];//模式串数组
int  ne[99999];     //next数组
int  nextval[99999];//nextval数组
int  length;        //模式串的长度

void get_next(char pat[],int nex[],int l)//求next数组
{
	int i=1,j=0;
	
	nex[1]=0;
	while(i<l)
	{
		if(j==0 || pat[i]==pat[j]) 
		  {
		  	++i;  ++j;
		  	nex[i]=j;
		  }
		else j=nex[j];
	}
}

void get_nextval(char pat[],int nexval[],int l)//求nextval数组
{
	int i=1,j=0;
	
	nexval[1]=0;
	while(i<l)
	{
		if(j==0 || pat[i]==pat[j])
		  {
		  	++i;  ++j;
		  	if(pat[i] != pat[j])  nexval[i]=j;
		  	else                  nexval[i]=nexval[j];
		  }
		else j=nexval[j];
	}
}

int main()
{
	while(true)//可以一次运行,测试无数次数据(当然是个死循环) 
	{
		cout<<"请输入模式串:"<<endl;
	    cin>>pattern+1; 
		length = strlen(pattern+1);
		//注意!此处是将模式串从下标为1处开始存储,所以使用pattern+1
		
		//调用get_next()函数求next数组
		get_next(pattern,ne,length); 
		cout<<"模式串的next数组为:"<<endl;
		for(int i=1;i<=length;i++)
		  cout<<ne[i]<<" ";
		cout<<endl;
		
		//调用get_nextval()函数求nextval数组
		get_nextval(pattern,nextval,length);
		cout<<"模式串的nextval数组为:"<<endl;
		for(int i=1;i<=length;i++)
		  cout<<nextval[i]<<" ";
		cout<<endl<<endl;
	}
	
	return 0;
}

效果展示 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值