串:
串是一种内容受限的线性表。
与线性表基本操作不同的是,串是以“串的整体”作为操作对象的。
考虑到存储效率和算法的方便性, 串多采用顺序存储结构。
BF算法:
算法思想简明,从始位置开始逐一匹配,匹配成功继续下一个,若失败则回溯:
主串的指针i总是回溯到 i-j+2 位置,
模式串的指针总是恢复到首字符位置 j= 1

代码如下:
( 为了方便说明问题,算法描述当中所用到的顺序存储的字符串都是从下标为1的数组分量开始存储的, 下标为0的分量闲置不用)
#include<stdio.h>
#define MAXLEN 255
//串的顺序存储
typedef struct
{
char ch[MAXLEN + 1]; //0号不用,从1开始
int length; //串的当前长度
}SString;
//BF算法
//返回模式T在主串s中第pos个字符开始第一次出现的位置。若不存在, 则返回值为0
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 - j + 2,子串从头再来
{
i = i - j + 2;
j = 1;
}
}
if (j > T.length) return i - T.length; //匹配成功
else return 0; //匹配失败
}
int main()
{
SString S, T;
S.ch[0]='#'; //0号不用,从1开始
T.ch[0]='#';
//输入
printf("请输入主串S的长度:");
scanf("%d", &S.length);
printf("请输入主串S:");
scanf("%s", (S.ch)+1); //0号不用,从1开始
printf("请输入子串T的长度:");
scanf("%d", &T.length);
printf("请输入子串T:");
scanf("%s", (T.ch) + 1); //0号不用,从1开始
//输出
printf("\nS:");
for (int i = 1; i <= S.length;i++)
{
printf("%c", S.ch[i]);
}
printf("\nT:");
for (int i = 1; i <= T.length; i++)
{
printf("%c", T.ch[i]);
}
int index=Index_BF(S, T, 1);
printf("\n你要查找的位置为:%d\n",index);
}
运行结果:

本文介绍了串的BF算法,该算法是一种简单的模式匹配方法,通过逐一匹配和回溯来寻找子串。文章提供了C/C++代码实现,并展示了运行结果。

5233

被折叠的 条评论
为什么被折叠?



