简称BF算法,又叫简单匹配算法
基本思路:从目标串的s="s0s1.....sn-1"的第一个字符开始和模式串t="t0t1.....tm-1"的第一个字符比较,若相等,则继续比较后续字符,否则从目标串s的第二个字符开始重新和模式串t的第一个字符比较。以此类推。若从模式串的第i个字符开始,每个字符依次和目标串的对应字符相同,则匹配成功,返回i;否则就失败,返回-1
下面举例来说明BF算法的思想。
设S=‘ababcabcacbab’, P=‘abcac’,从S的第1个字符开始,依次比较S和P中的字符,如果没有完全匹配,则从S第2个字符开始,再次比较...如此重复,直到找到P的完全匹配或者不存在匹配。用数学语言描述,就是比较SiSi+1...Si+n-1和P0P1...Pn-1,如果出现不匹配,则令i=i+1,继续这一过程,直到全部匹配,或者i>(m-n)。匹配过程如下(红色字体表示本趟比较中不匹配的字符):
第1趟
S: a b a b c a b c a c b a b
P: a b c
第2趟
S: a b a b c a b c a c b a b
P: a
第3趟
S: a b a b c a b c a c b a b
P: a b c a c
第4趟
S: a b a b c a b c a c b a b
P: a
第5趟
S: a b a b c a b c a c b a b
P: a
第6趟
S: a b a b c a b c a c b a b
P: a b c a c
由以上过程推知如下两点:
(1)第k次比较是从s的字符sk-1开始和t的第一个字符t0开始比
(2)设某次匹配si不等于tj,其中0<=i<=n,0<=j<m,则应有si-1=tj-1,....si-j+1=t1,si-j=t0。则下次比较的是从si-j+1与t0的比较开始
也就是说,若某次匹配有si=sj,则继续比较各自的下一个字符,即i++,j++。若某次匹配有si!=sj,则从s从si-j+1开始和t的t0开始比较,另j=0。
对应的BF算法如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int index(const char* s, const char* t)
{
int i = 0, j = 0;
int length_s = strlen(s); int length_t = strlen(t);
while (i < length_s&&j < length_t)
{
if (s[i] == t[j])
{
++i; ++j;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j >= length_t)
{
return i - length_t;
}
else return -1;
}
void Test1()
{
char s[] = "ababcabcacbab"; //串匹配,s的下标是6起
char t[] = "abcac";
printf("%d\n", index(s, t));
}
void Test2()
{
char s[] = "ababcabcacbab";
char t[] = "abcad";
printf("%d\n", index(s, t)); //不匹配,返回-1
}
int main()
{
Test1();
Test2();
return 0;
}