BF算法

BF(朴素)/(暴力破解法)算法就是普通的模式匹配算法,简单来说就是在主串str中寻找子串sub是否出现过

思想:

将主串str的第一个字符与子串的第一个字符进行匹配,若相等则继续比较第二个字符,若不相等,则比较主串的第二个字符与子串的第一个字符是否相等。依次比较,直到在主串str中找到和子串sub相等的字符串,得到在主串中出现的位置(下标)。

举例:

在主串“abcabacbabc”中寻找子串“abac”是否出现过?一眼看去很明显,但是要用代码写出来,很多人都下不去手。

java字符串匹配个数函数 java实现字符串匹配_子串


解析:

首先,需要定义两个变量i和j,分别表示主串和子串的0号下标位置,从0号下标所表示的字符开始比较,字符相同则i++,j++,如果匹配失败,i回退到起始位置加一的位置再开始遍历,即就是i=i-j+1, j回退到起始位置开始遍历;直到j的值等于子串的长度,则表示在主串中找到子串的位置,返回位置的下标return i-j,则为子串在主串中第一次出现的位置;否则return -1。

从下面代码中可以看出BF算法的时间复杂度为O(m*n),较高。

代码实现:

/**
 * @auther: 巨未
 * @DATE: 2019/2/15  9:44
 * @Description:
 */
public class BF {
    /**
     * @param str  主串
     * @param sub  子串
     * @param pos  从主串的pos位置开始找.
     * @return
     */
    public static int BF(String str,String sub,int pos) {
        int lenstr = str.length();
        int lensub = sub.length();
        //对pos的位置合法判断
        if (pos < 0 || pos > lenstr) {
            return -1;
        }
        int i = pos;  //遍历主串,
        int j = 0;    //遍历子串
        while (i < lenstr && j < lensub) {  //主串和子串都没有遍历完成的情况下,比较字符是否相等
            if (str.charAt(i) == sub.charAt(j)) { //下标所对应的字符相等时,
                i++;
                j++;
            } else {   //匹配失败
                i = i - j + 1; //
                j = 0;
            }
        }
            if (j >= sub.length()) { //子串遍历完成则返回匹配成功时 i 的起始位置。
                return i - j;
            } else {   // 没找到
                return -1;
            }
        }
   public static void main(String[] args) {
        String str = "abcdadcdacd";
        String sub = "adc";
        int index = BF(str,sub,0);
        System.out.println("第一次出现的位置:"+index);
    }
}

实现结果:

java字符串匹配个数函数 java实现字符串匹配_字符串匹配_02