朴素模式匹配BF算法,又称暴力匹配算法。
拓展:
什么是字符串的模式匹配?
给定两个串S=“s1s2s3 …sn”和T=“t1t2t3 …tn”,在主串S中寻找子串T的过程叫做模式匹配,T称为模式。
现规定i是主串S的指向下标,j是字串T的指向下标,现在假设现在主串S匹配到 i 位置,模式串T匹配到 j 位置。
如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有:
-
如果当前字符匹配成功(即S[i] = T[j]),则i++,j++,即两指针同时右移,继续匹配下一个字符;
-
如果失配(即S[i] != T[j]),令i = i - (j - 1),j = 0。相当于每次匹配失败时,i
回溯到本次失配起始字符的下一个字符,j 回溯到0。
代码如下:
#include<stdio.h>
#include<string.h>
int BF(char a[], char b[])
{
int i=0;//两将指针初始化,指向首位置
int j=0;
while(i<strlen(a) && j<strlen(b))//在指针下标不溢出的情况下执行循环
{
if(a[i] == b[j])//如果匹配成功,则右移一位继续匹配
{
i++;
j++;
}else//如果失配,则i回溯到初始比较位置的下一位,j回到首位置
{
i=i-j+1;
j=0;
}
}
if(j>=strlen(b))//通过j的值判断是否查找到所需的模式串
{
return i-j;//返回模式串在文本串中首元素的位置
}else
{
return -1;
}
}
结果分析
void main()
{
char a[]="goole";
char b[]="goodgoole";
printf("%d\n", BF(b, a));
}