BF算法
BF算法,即暴力(Brute Force)算法,是一种模式匹配算法,但也可以应用在其他场合,它的核心思想就是从主串S的第一个字符与子串T的第一个字符进行匹配,若相等,则继续比较主串S的第二个字符和 子串T的第二个字符;若不相等,则比较主串S的第二个字符和子串T的第一个字符,依次比较下去,直到得出最后的匹配结果。
BF算法思路直观简明,但匹配失败时主串指针总是回溯到 i - j +2位置,因此算法的时间复杂度高。
BF算法基本步骤(下标从1开始)
模式匹配不一定是从主串的第一个位置开始,可以指定主串中查找的起始位置pos
(1) 分别利用计数指针 i 和 j 指示主串S和模式串T中当前正待比较的字符位置,i 初始值为pos, j 初始值为1
(2)如果两个串均为比较到串尾,即 i 和 j 均分别小于等于S和T的长度时,则循环执行以下操作:
1.S.ch[i]和T.ch[j]比较,若相等,则i和j分别指示串中下一个位置,
继续比较后续字符
2.若不等,指针后退重新开始匹配,从主串的下一个字符(i=i-j+2)起再重新
和模式串的第一个字符(j=1)比较
(3)如果 j > T.length,说明模式串T中的每个字符依次和主串S中的一个连续
的字符序列相等,则匹配成功,返回和模式串T中第一个字符相等的字符在主串S中的序号( i - T.length );否则匹配不成功,返回0
算法描述
int Index_BF(SString S,SString T,int pos)
{
//其中,T非空,1<= pos <= S.length
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; //匹配失败
例子(判断数组b是否为数组a的子串)
代码一(利用BF算法,下标从1开始)
#include<stdio.h>
int main()
{
int a[100],b[100],i,j,m,n;
scanf("%d%d",&n,&m);
//输入数组a
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
//输入数组b
for(i=1;i<=m;i++)
scanf("%d",&b[i]);
i=j=1;
while(i<=n&&j<=m) //两个数组均未到最后的元素
{
if(a[i]==b[j])
{
//继续比较后续的元素
++i;
++j;
}
else
{
//下标后退,继续开始匹配
i=i-j+2;
j=1;
}
}
if(j>m) //若寻找成功,此时j=m+1,
printf("%d\n",i-m-1); //为了满足题目下标从0开始,所以i-m还要减1
else
printf("No Answer\n");
return 0;
}
代码二(利用BF算法,下标从0开始)
#include<stdio.h>
int main()
{
int a[100],b[100],i,j,m,n;
scanf("%d%d",&n,&m);
//输入数组a
for(i=0;i<n;i++)
scanf("%d",&a[i]);
//输入数组b
for(i=0;i<m;i++)
scanf("%d",&b[i]);
i=j=0; //初始化
while(i<n&&j<m) //两个数组均未比较到末尾
{
if(a[i]==b[j])
{
//继续比较后续元素
++i;
++j;
}
else
{
i=i-j+1; //下标后退继续比较
j=0;
}
}
if(j==m) //下标从0开始算,若是数组b是a的子数组的话,此时j=m,
printf("%d\n",i-m);
else
printf("No Answer\n");
return 0;
}
样例输入 Copy
8 3
3 2 6 7 8 3 2 5
3 2 5
样例输出 Copy
5