一、前言
暴力匹配(Brute-Force-Match)是字符串匹配算法里最基礎的算法,雖然效率比較低,但勝在方便理解,在小規模數據或對時間無嚴格要求的情況下可以考慮。
二、代碼
#include <stdio.h>
#include <string.h>
int bf(char *l,char *s);
int main(void)
{
char s1[201],s2[201]; //根據需要設定數組大小
printf("母串:");
scanf("%s",s1);
printf("子串:");
scanf("%s",s2);
int a=strlen(s1),b=strlen(s2),re=0;
if(a>=b) //母串長度要比子串長
{
re=bf(s1,s2);
if(re==1)
printf("%s是%s的子串",s2,s1);
return 0;
}
else
printf("無法匹配");
return 0;
}
int bf(char *l,char *s)
{
if(!strcmp(l,s)) //如果兩個字符串相同直接返回
return 1;
int ll=strlen(l),sl=strlen(s),di=ll-sl;
for(int i=0;i<=di;i++)
{
int temp=0;
for(int j=0;j<sl;j++)
{
if(l[i+j]==s[j])
continue;
else
{
temp=1;
break;
}
}
if(temp==1)
continue;
else if(temp==0)
return 1;
}
printf("子串不存在");
return 0;
}
三、主要思路
每次從子串與母串的第一個字符開始比較,若是匹配成功則繼續下一個字符的匹配;若是匹配失敗則從母串的下一個字符開始與子串的第一個字符重新匹配,循環往復直到匹配成功或者匹配失敗。
四、分析時間復雜度
我們設子串長為m,母串長為n,同時m比n小的多。
在最好情況下,子串與母串的失配都是發生在第一個字符處,時間復雜度為O(m+n)。
在最壞的情況下,即子串每一次與母串失配都是在最后一個字母時,時間復雜度為O((m*n)。