串(串的模式匹配算法BF算法)

串的定义

串的逻辑结构和线性表极为相似,区别仅在于串的数据对象约束为字符集。然而,串的基本操作和线性表有很大差别。在线性表的基本操作中,大多以单个元素作为操作对象,列入,在线性表中查找某个元素,求取某个元素,在某个位置上插入一个元素或删除一个元素等;而在串的基本操作中,通常以串的整体作为操作对象,例如,在串中查找某个子串,求取一个子串,在串的某个位置上插入一个子串,以及删除一个子串等。

串的存储结构

串的顺序存储

第一种

//-----串的定长顺序存储结构-----
#define MAXLEN 255  //串的最大长度
typedef struct{
	char ch[MAXLEN+1];		//存储串的一维数组
	int length;			//串的当前长度 
}SString; 

这种定义方式是静态的,在编译时就确定也串空间的大小。

第二种


//------串的堆式存储结构------ 
typedef struct{
	char *ch;	        //若是非空串,则按串长分配存储区,否则ch为NULL
	int length;		   //串的当前长度 
}HString;

这种方式是动态的,能够根据实际情况动态地分配和释放数组空间。

串的链式存储结构

//------串的链式存储结构------
#define CHUNKSIZE 80		//可由用户定义的块大小
typedef struct Chunk{
	char ch[CHUNKSIZE];
	struct Chunk *next;
}Chunk;
typedef struct{
	Chunk *head,*tail;	 //串的头尾指针
	int length;		    //串的当前长度 
}LString; 

串值得链式存储结构对某些串操作,如链接操作等,有一定的方便之处,但总的说来,不如顺序存储结构灵活,它占用存储量大且操作复杂。此外,串值再链式存储结构时,串操作的实现和线性表在链表存储结构中的操作类似。

串的模式匹配算法——BF算法

子串定位运算通常称为串的模式匹配或串匹配。此运算的应用非常广泛,比如在搜索引擎、拼写检查、语言翻译、数据压缩等应用中,都需要进行串匹配。串的模式匹配设有两个字符串S和T,S为主串也成为正文串,T为子串也叫作模式,在主串S中查找与模式T相匹配的子串,如果匹配成功,确定相匹配的子串中的第一个字符出现在S串中的位置。
最简单直观的模式匹配算法是BF(Brute-Force)算法。
匹配步骤图如下:
在这里插入图片描述
算法描述

int Index_BF(SString S,SString T,int pos){
	int i=pos,j=1;//初始化,pos为主串中开始搜索的位置,一般为1 
	while(i<=S.length&&j<=L.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;                     //匹配失败    
	}
}

参考自《数据结构》严蔚敏

发布了11 篇原创文章 · 获赞 26 · 访问量 4376

猜你喜欢

转载自blog.csdn.net/qq_45918426/article/details/104378901