BF(朴素)匹配算法
概念:
BF(朴素)是简单的模式匹配算法,就是通过主串str匹配是否存在子串sub
举例:
假设我们从下面的主串String str = "abcababcabc"中,找到String sub = "abcabc"这个子串的位置,我们通常需要以下步骤:
1、分别定义i和j为主串和子串所对应的下标;
主串str从0号下标开始,str与sub 4号下标以前,字母都匹配成功,但str 5号下标字母是a而sub的是c,所以第一位匹配失败,如下所示:
2、此时i回退到1号下标,str从第2个开始,j回退到0号下标,sub从头开始重新匹配,str首字母是b,sub首字母是a,匹配失败,如下:
3、此时i回退到2号下标,str从第3个开始,j回退到0号下标,sub从头开始重新匹配,str首字母是c,sub首字母是a,匹配失败,如下:
4、此时i回退到3号下标,str从第4个开始,j回退到0号下标,sub从头开始重新匹配,str首字母是a,sub首字母是a,继续i+1,j+1,str第5个为b,sub第2个为b,继续各自+1操作,str第6个为a,sub第3个为c,匹配失败,如下:
5、此时i回退到4号下标,str从第5个开始,j回退到0号下标,sub从头开始重新匹配,str首字母是b,sub首字母是a,匹配失败,如下:
6、此时i回退到5号下标,str从第6个开始,j回退到0号下标,sub从头开始重新匹配,str首字母是a,sub首字母是a,继续第4步操作,发现从5号下标以后主串和子串匹配,找到返回下标,如下:
简单地说,就是i每次回退,是主串的每一个字符作为子串开头,与要匹配的子串进行匹配。
代码实现:
/*
BF算法
i回退,j回退
主串m个数据,子串n个数据,时间复杂度m*n
*/
public class TestDemo {
public static int BF(char[]str,char[]sub){
int i=0,j=0;
while (j<sub.length && i<str.length){
if (str[i]==sub[j]){
i++;j++;
}else {
i=i-j+1;
j=0;
}
}
if (j==sub.length){
return i-j;
}else {
return -1;
}
}
public static void main(String[] args) {
String str = "abcababcabc";
String sub = "abcabc";
char[] ch1 = str.toCharArray();
char[] ch2 = sub.toCharArray();
int index = BF(ch1,ch2);
System.out.println("请输出主串str:"+str);
System.out.println("请输出子串sub:"+sub);
System.out.println("若找到,请输出对应的主串下标:"+index);
}
}
打印结果:
请输出主串str:abcababcabc
请输出子串sub:abcabc
若找到,请输出对应的主串下标:5
通过开始的分析,以及打印结果,我们都可以知道在已知的这两个字符串中,子串在主串存在,且从主串的5号下标开始两个完全匹配。