数据结构—串—kmp

目录

串的存储结构

串的顺序存储

定长式:

堆式:

串的链式存储

 串的模式匹配算法

BF算法

KMP算法

next数组获取:

kmp:


串的存储结构

串的顺序存储

定长式:

#include<bits/stdc++.h>
using namespace std;
 
#define MAXSIZE 225  //顺序栈存储空间的初始分配量
#define OK 1    //成功标识
#define ERROR 0 //失败标识
 
typedef int Status;	//Status是函数的类型,其值是函数结果状态代码,如OK等

typedef struct {
	char ch[MAXSIZE];
	int len;//当前长度 
}sstring; 

堆式:

#include<bits/stdc++.h>
using namespace std;
 
#define MAXSIZE 225  //顺序栈存储空间的初始分配量
#define OK 1    //成功标识
#define ERROR 0 //失败标识
 
typedef int Status;	//Status是函数的类型,其值是函数结果状态代码,如OK等

typedef struct {
	char *ch;
	int len;//当前长度 
}hsstring; 

串的链式存储

1、链表存储串值时,存在节点大小问题,即每个节点可存放一个字符也可存放多个字符,

2、但串长不一定是节点大小的整数倍,则链表中的最后一个节点不一定全被串值占满,此时通常用“#”补上

#include<bits/stdc++.h>
using namespace std;
 
#define MAXSIZE 225  //顺序栈存储空间的初始分配量
#define OK 1    //成功标识
#define ERROR 0 //失败标识
 
typedef int Status;	//Status是函数的类型,其值是函数结果状态代码,如OK等

typedef struct chunk{//chunk-块 
	char ch;
	struct chunk *next;
}chunk; 
typedef struct {
	chunk *head;
	chunk *tail;
	int length;
}lstring; 

 串的模式匹配算法

BF算法

int BF(sstring s,sstring t ,int pos)
{
	int i=pos,j=1;//初始化
	while(i<=s.len &&j<=t.len ) //未比较到串尾 
	{
		if(s.ch[i]==t.ch[j])
		{
			i++;j++;//继续比较后序字符 
		}
		else
		{
			i=i-j+2;//主串回溯;i-j+1回到初始位置,再加1,开始匹配 
			j=1;//子串回溯 
		} 
	}
	if(j>t.len ) 
		return i-t.len ;//匹配成功 
	else
		return 0;
}

KMP算法

前期了解:

KMP 算法主要是通过消除主串指针的回溯,以及改变字串回溯的位置来提高匹配的效率的

具体实现就是通过一个next()函数(即构造的前缀表)实现,每一个字符前的字符串的最长相等前后缀即该字符的前缀值

(7条消息) kmp算法简单讲解_turbo夏日漱石的博客-CSDN博客

next前缀值不仅仅代表着对应位置字符串前后缀相同元素长度的最大值

因为是前后缀的公共元素,它还可以表示该位置与从字符串首位起固定位置的字符相同,即指向自身与其相同的元素的位置。

next数组获取:

void getnext(sstring t,int next[])
{
	int i=1,j=0,next[1]=0;//初始化
	while(i<t.len )//未比较到串尾 
	{
		if(j==0||t.ch[i]==t.ch[j])
		{
			i++;j++;//比较后继字符 
			next[i]=j; 
		}
	} 
}

kmp:

int KMP(sstring s,sstring t ,int pos)
{
	int i=pos,j=1;//初始化
	while(i<=s.len&&j<=t.len ) //未比较到串尾
	{
		if(j==0||s.ch[i]==t.ch[j])
		{
			i++;j++;//比较后继字符 
		}
		else
			j=next[j];//模式串向右回溯 
	 } 
	if(j>t.len )
		return i-t.len ;
	else 
		return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值