串的模式匹配---Brute-Force算法

简称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 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;
}




猜你喜欢

转载自blog.csdn.net/qq_34793133/article/details/80909632