BF算法(查找子串)

BF(Brute-Force)

模式串:S    "abcababcabc"

目标串:P    "abcabc"

用i 和 j 分别表示模式串S和目标串P的下标,初始值都为0


       思路:将S中某个位置i起始的子串和P相比较。即从 j=0 起比较 S[i+j] 与 P[j],若相等,则在S 中存在以 i 为起始位置匹配成功的可能性,继续往后比较( j逐步增1 ),直至与P串中最后一个字符相等为止,否则改从S串的下一个字符起重新开始进行下一轮的"匹配",即 i 增1,而 j 退回至0,重新开始新一轮的匹配。

1、首先字符串A从头开始,判断往后strlen(B)个字符串是否和字符串B相等;

2、如上图,当i走到下标为5的时候失配,则i回退到1(即回退了i - j + 1),j回退到0,再次进行匹配

3、如上图,当回退为i为1,j为0是还是失配,i接着回退i - j + 1 = 2,j接着回退到0,继续进行匹配

4、重复上述步骤,直到:i = 5,j = 0

从上图可以看出 j 走到末尾,P与S都匹配,说明模式串P从 i 开始存在目标串S。

//  O(n*m)
//若串S中从第pos(S 的下标0≤pos<StrLength(S))个字符起存在和串P相同的子串,
//则称匹配成功,返回第一个这样的子串在串P中的下标,否则返回 -1  
int BF(const char *s, const char *p, int pos)
{
	assert(s != NULL && p != NULL);

	int lens = strlen(s);
	int lenp = strlen(p);

	if (lens < lenp)
	{
		return -1;
	}

	int i = pos, j = 0;

	while (i < lens && j < lenp)
	{
		if (s[i] == p[j])//相等依次往后比较
		{
			i++;
			j++;
		}
		else
		{
			i = i - j + 1;  // 使i回退到本次比较的初始位置的下一个位置
			j = 0;
		}
	}

	if (j >= lenp) // 如果j越界,证明比较时已经将p串访问完,则找到了相等的串
	{
		return i - j;
	}

	return -1;
}

猜你喜欢

转载自blog.csdn.net/Aspiration_1314/article/details/83049141