java朴素(BF)模式匹配算法解析,及其代码实现

本文介绍了BF(朴素)匹配算法的概念和工作原理,通过一个具体的例子展示了如何在主串中查找子串的过程。文章还提供了Java代码实现,展示如何在给定的字符串中找到子串并返回其开始位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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号下标开始两个完全匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值