串的两种表示方法与 BF 及 KMP 匹配算法

串的操作和线性表差不多,但是其链式结构与链表有所不同,运用到了块链的结构。串的两种匹配算法应当是我们应该着重掌握的,BF算法十分简单,属于纯暴力。KMP算法十分晦涩难懂,代码不长,但是需要花一定的时间琢磨。笔者说点题外话:上个学期本人就看到了这个算法,研究了两三天没研究透,一度成为了笔者的噩梦。但当我这次再遇到后,琢磨了一个下午终于研究明白了。推荐B站上一个up主的视频,大家可以参考,up用了图解的形式对next数组的求解问题进行了直观的表现。

KMP算法之求next数组代码讲解_哔哩哔哩_bilibili

想起来一个理论,一个问题就像一堵高墙,有时候不能理解,不是因为你不够努力,而是时机未到,或许在一天后,或许几个月后,或许永远都不能理解。但是如果理解了,就像跨过了高墙,前方便是康庄大道,豁然开朗,诸位good luck。

代码:

#include"stdio.h"
#include"stdlib.h"  //该文件中包含malloc和free()
#define MAXLEN 255

//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
int next[MAXLEN];

//顺序存储结构的串
typedef struct
{
	char ch[MAXLEN + 1];
	int length;
}SString;

//串的链式存储结构:块链存储
#define CHUNKSIZE 80  //块的大小由用户自己定义
typedef struct Chunk
{
	char ch[CHUNKSIZE];
	struct Chunk *next;
}Chunk;

typedef struct
{
	Chunk *head, *tail;  //串的头指针和尾指针
	int curlen;   //串当前的长度
}LString;   //字符串的块链结构


//串的模式匹配算法:返回主串中子串第一次出现的位置
//BF算法
int Index_BF(SString S,SString T,int pos)
{
	int i = pos;
	int j = 1;
	while (i<=S.length && j<=T.length)
	{
		if (S.ch[i] == T.ch[j])
		{
			i++;
			j++;
		}
		else
		{
			i = i - j + 2;
			j = 1;
		}
	}
	if (j > T.length) return i - T.length;
	else return 0;
}

//KMP算法 (看门牌)
//对主串预处理,先求next数组
void get_next(SString T, int next[])
{
	int i = 1;
	next[1] = 0;
	int j = 0;
	while (i < T.length)
	{
		if (j == 0 || T.ch[i] == T.ch[j])
		{
			next[++i] = ++j;
		}
		else j = next[j];
	}
}
int Index_KMP(SString S, SString T, int pos)
{
	int i = pos;
	int j = 1;
	while (i <= S.length && j <= T.length)
	{
		if (S.ch[i] == T.ch[j])
		{
			i++;
			j++;
		}
		else
		{
			next[j] = j;  //主串不回溯,字串回溯的位置由next数组来定
		}
	}
	if (j > T.length) return i - T.length;
	else return 0;
}

int main()
{
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值