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