BF与KMP算法详解

本文探讨了暴力匹配算法BF与KMP算法的对比,重点讲解了KMP算法中的next数组优化,如何通过构建next数组减少回退次数,以降低字符串匹配的时间复杂度。通过实例和代码解析,揭示了KMP算法在主串搜索子串时的高效策略。

日升时奋斗,日落时自省 

目录

一、BF暴力算法

 二、KMP算法

1、next数组

2、next数组优化(nextval)

一、BF暴力算法

暴力算法是普通的模式匹配算法 

针对一个主串和一个子串,子串是否能跟主串的某一段进行完全匹配,直白点就是子串在主串中出现。(并且返回子串第一次出现的下标位置)

BF思想:就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和T的第二个字符再进行比较,依次下去,如果不相等的话,S需要退回,退回多少?当前T字符串位置-1(后面通过例题来解释当前现象)

例题演示:给出字符串 ”ababcabcdabcde”作为主串, 然后给出子串: ”abcd”,现在我们需要查找子串是否在主串中出现,出现返回主串中的第一个匹配的下标,失败返回-1 ;

下面给出图解:

 这里附一下代码:

//暴力算法
    public static int BF(String str,String sub){
        if(str==null||sub==null){     //稍微谨慎一点 如果字符串任意一个为空的话就不用找了, 直接返回
            return -1;
        }
        int strlen=str.length();
        int sublen=sub.length();
        if(strlen==0||sublen==0){     //字符串虽然存在但是没有字符存在 也就找不到  直接返回
            return -1;
        }
        int i=0;
        int j=0;
        //首先就是整体遍历
        while(i<strlen&&j<sublen){
            //如果两个相等的话  就可以直接走了
            //如果两个主串和子串的字符相等的话 主串 和 子串都进行++ ,进行两个字符串的下一个字符比较
            if(str.charAt(i)==sub.charAt(j)){
                i++;
                j++;
            }else{
                //如果不等呢  那子串就从0开始,重新和主串比较
                //主串回退  :那前面有一段肯定是跟子串一模一样的 ,所以主串当前下标位置减去 子串当前位置下标回到了原来字符串相等的位置,但是还需要在该位置加一 进行下一次新的比较开始
                i=i-j+1;
                j=0;
            }
        }
        //只有子串走完了才算是找到 所以大于或者等于都在其内
        if(j>=sublen){
            return i-j;    //为什么是 i-j  因为返回当前已经找到的子串的第一个下标 用当前下标减去子串长度
        }
        //没有找到的话 ,就是子串没有走完呗
        return -1;
    }

    public static void main(String[] args) {
        System.out.println(BF("ababcabcdabcde", "abcd"));
    }

 这里有一个位置理解可能有点困难,结合案例 自己画画图,理解比较快捷

代码配有注释:

这里再次解释一下 ,该段代码

while(i<strlen&&j<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值