一,BF
1.BF算法
BF算法即为暴力算法,是普通模式匹配算法
2.BF算法的时间复杂度
平均情况能到达O(m+n),最坏情况为O(m*n)
3.BF算法核心思想
是一种笨方法,即为一个一个去匹配每次的字符,当不符合时,移动指针重新回到下一个我们想搜索匹配的字符串
4.BF算法实现
#include <stdio.h>
#include <string.h>
char* mystrstrt(char* a, char* b);
char* mystrstrt(char* a, char* b)
{
if (strlen(b)==0)//b为空,还找啥
{
return 0;
}
if (strlen(a) < strlen(b))//一定不对
{
return -1;
}
int i = 0, j = 0;//两个带着数组去匹配
while (i < strlen(a) && j < strlen(b))
{
if (*(a + i) == *(b + j))
{
i++;
j++;
}
else
{
i = i - j + 1;//每次重回位置且+1(就是移动位置)
j = 0;//清空为0
}
}
if (j == strlen(b))//怎么判断有没有匹配到全部,j此时和b的长度相同时,肯定成功匹配了
{
return a + i - strlen(b);
}
else
{
return -1;
}
}
int main()
{
char a[] = "aasdaddafd";
char b[] = "dad";
char *t=mystrstrt(a, b);
printf("%s\n", t);
return 0;
}
二,力扣 .28题
1.题目
2.思路讲解
实际上和上面代码相同,有一点不同的就是他要返回下标
下标不就是当前指向haystack的下标减去need的长度吗!!!
解决了
3.代码实现
int strStr(char * haystack, char * needle){
if(strlen(needle)==0)
{
return 0;
}
if(strlen(haystack)<strlen(needle))
{
return -1;
}
int i=0,j=0;
while(i<strlen(haystack)&&j<strlen(needle))
{
if(*(haystack+i)==*(needle+j))
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j==strlen(needle))
{
return i-strlen(needle);
}
else
{
return -1;
}
}
三,总结
要实现题目不难,但菜狗的我只会用BF去实现,肯定比不过各位大佬的,只不过借此总结BF算法