概述
串的模式匹配算法:子串的定位运算
算法思想:
设有主串S,模式T。有 i 和 j 分别指向S和J的首个元素。(i=1;j=1;)
设有pos。pos指T在S中首次出现的位置的首地址。初始指向S的首元素。
将T中的首个元素与S中首个元素对比
①若相同:i++与j++对比
②若不同:S回到本次循环开始的那个元素的下一个元素(pos++;),T回到首元素(j=1;)
关于存储:采用定长顺序存储结构。
(ps:从下标为1的数组分量开始存储,下标为0的分量闲置不用。)
代码实现:
#include<stdio.h>
#include<string.h>
#define MAXLEN 255 //串的最大长度
//采用静态顺序存储结构(定长)
typedef struct{
char ch[MAXLEN+1]; //存储串的一维数组
int length; //串的长度
}SString;
//BF算法
//查找 模式T 在 主串S 中第pos个字符开始第一次出现的位置,并返回
//若不存在,则返回0 (T非空,1<=pos<=S.length)
int Index_BF(SString S,SString T,int pos)
{
int i,j;
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; //返回0(顺序存储的字符串是从下标为1的数组分量开始存储的,下标为0的分量闲置不用)
}
//主函数
int main()
{
SString S,T;
int tag;
strcpy(S.ch, "Cprogramming");
strcpy(T.ch, "programming");
S.length=strlen(S.ch);
T.length=strlen(T.ch);
tag=Index_BF(S,T,1);
printf("%dn",tag);
return 0;
}
时间复杂度:(主串S长为n,子串T长为m)
最好的情况:O(n+m) 每次不匹配的都是模式串T的首字母(不成功就直接换下一个来比较)
最坏的情况:O(m*n) 每次不成功的匹配都是模式串T的最后一个字母(每次快成功了又从头开始)
总的来说,复杂度还是挺高的,但是符合人的基本思维,易于理解,编程实现容易。
如果要提高效率,试试KMP算法(但是KMP就没这么好理解咯)。
最后
以上就是瘦瘦月饼为你收集整理的串的模式匹配(C语言实现)——BF算法的全部内容,希望文章能够帮你解决串的模式匹配(C语言实现)——BF算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复