串的操作和线性表差不多,但是其链式结构与链表有所不同,运用到了块链的结构。串的两种匹配算法应当是我们应该着重掌握的,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;
}