BF算法(字符串查找)

本文介绍了BF(BruteForce)算法,这是一种简单的字符串模式匹配算法,虽然理解容易但效率较低,时间复杂度为O(m*n)。通过示例解释了算法过程,并提供了一个Java实现。文章指出BF算法在匹配失败时会回溯,而KMP算法通过预处理next数组能显著提高效率。最后鼓励读者学习KMP算法以优化匹配性能。

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

前言

字符串的匹配算法也是很经典的一个算法,在面试,刷题的时候常常会遇到,而BF算法是字符串模式匹配中的一个简单的算法。

BF(Brute Force)算法和它的名字一样,就是粗暴!是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。没有什么技巧性,就是一个个进行比较得出最后的结论,这个方法也是最通俗易懂的,后面一篇我有写KMP算法是对BF算法的极大优化包括对next数组的优化。学完这个BF算法看看你是否对KMP算法感兴趣,如果有兴趣可以学习下我的下一篇KMP算法

优势:易懂

劣势:复杂度高,效率低,时间复杂度为O(m*n);

BF方法:

现在给你两个字符串母串“abcdabcdef”,子串“def”你会怎么去查找子串位于母串的位置呢?BF算法是同时遍历母串和子串的每一个字符如果相同两个字符串都向后移动,如果不同将母串返回到最开始遍历的下一个元素上,子串返回0位置重新遍历,直到子串的字符在母串中全部找到对应位置。

我用i表示对母串的遍历,j表示对子串的遍历。

下面我给大家画了个图

匹配失败

每次失败母串返回到最开始遍历的下一个元素位置上(i=i-j+1),子串返回0位置重新遍历

 匹配成功

返回母串的d的7下标即可,这里可以用i=i-j表示

 

public class bf {
    public static int BF(String str,String sub,int pos) {
        int strLength=str.length();
        int subLength=sub.length();
        if(subLength>strLength-pos) {
            return -1;
        }
        int i=pos,j=0;
        //循环条件是当i对母串的遍历以及j对子串的遍历不越界
        while(i<strLength && j<subLength) {
            //单个字符匹配成功
            if(str.charAt(i)==sub.charAt(j)) {
                i++;
                j++;
              //失败情况
            } else {
                //母串返回开始匹配的下一个位置上,子串返回0位置
                i=i-j+1;
                j=0;
            }

        }
        //这里只有子串被遍历完才能说明他被母串包含了,并且返回对应的下标
        if(subLength==j) {
            return i-j;
        }
        return -1;
    }
    public static void main(String[] args) {
        //这里是我对BF算法的测试
        String str="asdffre";
        String sub="ffr";
        int place=BF(str,sub,0);
        System.out.println(place);

    }
}

BF算法是比较无脑的,这里聪明的你肯定了解了BF算法了,下面如果还想学习优化的KMP算法以及next数组的优化对KMP的进一步优化请学习我下一篇博客!!! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极品小學生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值