【串,BF算法】

文章目录

  • 串(String)---- 零个或多个任意字符组成的有限序列
    • 串的定义----几个术语
  • 串的类型定义,存储结构及运算
    • 串的顺序串结构
    • 串的链式串结构
    • 串的链式结构
    • 串的模式匹配算法----BF算法

串(String)---- 零个或多个任意字符组成的有限序列

【串,BF算法】_第1张图片

串的定义----几个术语

  • 子串:串中任意个连续字符组成的子序列称为该串的子串。
  • 主串:包含子串的串相应地称为主串。
  • 字符位置:字符在序列中的序号为该字符在串中的位置。
  • 子串位置:子串第一个字符在主串中的位置。
  • 空格串:由一个或多个空格组成的串,与空串不同。
  • 串相等:当且仅当两个串的长度相等并且各个对应位置上的字符相同时,这两个串才相等。(所有的空串是相等)。

【串,BF算法】_第2张图片

串的类型定义,存储结构及运算

ATD String{
数据对象
数据关系
基本操作
}

串的顺序串结构

//串的顺序存储结构
typedef struct {
	char ch[MAXLEN + 1];//一维数组存数据
	int length;//串的长度
}SString;

串的链式串结构

//串的链式存储结构
typedef struct Chunk{
char ch[CHUNKSIZE];
struct Chunk* next;
}Chunk;
typedef struct {
	Chunk* head, * tail;//串的头指针,尾指针
	int curlen;//串的当前长度
}LString;//字符串的块链结构

串的链式结构

因为链式结构操作方便,但存储密度很大。
所以改变方式就是在一个串的每一个结点存储多个字符。

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

采用穷举法
B-F简称为BF算法,简称为单匹配算法。
【串,BF算法】_第3张图片

算法的思路是从每一个字符开始依次与T的字符进行匹配。

Index(S,T,pos)

  • 将主串的第pos个字符和模式串的第一个字符比较,
  • 若相等,继续逐个比较后续字符;
  • 若不等,从主串的下一个字符起,重新与模式串的第一个字符作比较。
    直到主串的一个连续字符序列与模式串相等。返回值为S中与T匹配的子序列的第一个字符的序号,即匹配成功。
    否则,匹配失败,返回值0;
int IndexBF(SString S, SString T,int pos) {
	int i = pos, 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;//模式匹配不成功
		}
	}
}
	

在这里插入图片描述

你可能感兴趣的:(算法)