模式匹配算法-BF算法

简介

BF 算法即蛮力匹配算法,非常简单粗暴的在主串中匹配子串,一个个匹配,匹配如果不对,就从主串开始匹配的地方的下一个字符又重新开始匹配,直到全部匹配完全,这种算法思考起来虽然很简单,但是效率确实很低的,模式匹配中除了这个 BF 算法之外,还有一个高效经典的 KMP 算法,KMP 就不在这里实现了

Java 实现

逻辑描述

BF 算法我思想是,将子串和主串一一对应着匹配,当子串和主串的字符匹配失败时候,主串从当开始和子串匹配的那个位置后移一位,再重新和子串的起始点一一匹配,终止条件一般来说要求主串的游标 i 小于主串长,且子串游标 j 小于子串长即可,但是我觉得还不够节省时间,因为对于子串较长的情况,当主串剩余长度都要小于子串全长的时候,其实都没必要去和子串做匹配了,因为长度都不够肯定匹配不成功,所以我还加了一个终止判断条件,即主串剩余长度必须要大于等于子串剩余长度。当匹配终止时候,我们判断当子串的游标和子串长相等时候,那肯定在主串中匹配到了子串,并返回主串开始匹配的下标值,否则主串中没有匹配到子串,并返回 -1

下方 java 实现中,m 代表 main string 即主串,s 代表 substring 即子串,匹配到就返回主串下标值,匹配不到就直接返回 -1

算法图解

BF

代码实现

// BF 算法
public int bruteForce(String m, Sting s) {
    int i,j;
    for (i = 0,j = 0; m.length() - i >= s.length() -j && i < m.length() && j < s.length();) {
        if (m.charAt(i) == s.charAt(j)) {
            i++;
            j++;
        }
        else {
            i = i - j + 1;
            j = 0;
        }
    }
    if (j == s.length())
        return i - j;
    else 
        return -1;
}

时间复杂度

最好情况:O(n + m)

最坏情况:O(n * m)

发布了197 篇原创文章 · 获赞 62 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/abcnull/article/details/104366309