【数据结构与算法】串的类型定义,BF算法及KMP算法

串的顺序存储结构

#define MAXLEN 255
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算法(简单匹配法)
KMP算法(速度快)

int Index_BF(SString S,SString T){
	int i=1,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;     //模式匹配不成功
	}

BF算法时间复杂度 (n-m+1)*m
其中,n为主串长度,m为子串长度

KMP算法

int Index_KMP(SString S,SString T,int pos){
	i=pos,j=1;
	while(i<S.length&&j<T.length){
		if(j==0||S.ch[i]==T.ch[j]){i++;j++}
		else
			j=next[j];    //i不变,j后退
	}
	if(j>T.length) return i-T.length; //匹配成功
	else return 0;   //返回不匹配标志
	}
void get_next(SString T,int &next[]){
	i=1;next[1]=0;j=0;
	while(i<T.length){
		if(j==0||T.ch[i]==T.ch[j]){
			++i;++j;
			next[i]=j;
			}
		else
			j=next[j];
		}
	}

主串i不必回溯。可提速到O(m+n)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值