一:BF算法——Brute Force
1.bf算法是一种暴力算法,它的核心思想是回溯。
2.bf算法可以实现在两个串中,若一个串是另一个串的子串,即可通过此算法找到子串在主串中的第一个元素的位置。
二:实现步骤:
1.创建两个字符数组,主数组大小>=子数组的大小;输入成立的元素集,如:
char M[]="ababcd";
char S=[]="abc";
2.创建 int BF(); 函数,返回类型为 int 即位置;
3.BF接收M,S为参数;创建i,j分别记录M,S的下标;
int BF()函数的实现思路:
4.1创建while()循环,M[i]!='\0' 的时候为判断条件
{
4.2if一下,当 M[i]==S[j]&&S[j]!='\0' 时,即可进行 i++,j++ 操作,使数组往后走;
4.3else一下,即上面条件不满足的时候,可进行将 (i=i-j+1);同时j=0;也就是将子数组回到最开始的地方;主数组右移一位,这里面这里是BF算法的核心。
4.4最后再if一下,当下标 j==strlen(S) 的时候,也就是说到M数组'\0'前时,即 return i-j+1; (因为数组的下标从0开始,所以+1)也就是子串在主串的第一个元素的位置。
}
5.return -1;即它们并没有主次串关系!
三:代码:
#include<stdio.h>
#define MAX 20
int BF(char* a, char* b)
{
int i = 0;
int j = 0;
while (a[i] != '\0')
{
if (a[i] == b[j] && b[j] != '\0')
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
if (j == strlen(b))
{
return i - j + 1;
}
}
return -1;
}
//BF算法 求子串首元素在主串的位置
int main()
{
//主串
char a[MAX] = "ababc";
//子串
char b[MAX - 1] = "abc";
int pos = BF(a,b);
//返回位置
printf("%d\n", pos);
return 0;
}
总结:
BF算法很暴力,核心思想是回溯,时间复杂度较高。