BF算法
BF(朴素)/(暴力破解法)算法就是普通的模式匹配算法,简单来说就是在主串str中寻找子串sub是否出现过
思想:
将主串str的第一个字符与子串的第一个字符进行匹配,若相等则继续比较第二个字符,若不相等,则比较主串的第二个字符与子串的第一个字符是否相等。依次比较,直到在主串str中找到和子串sub相等的字符串,得到在主串中出现的位置(下标)。
举例:
在主串“abcabacbabc”中寻找子串“abac”是否出现过?一眼看去很明显,但是要用代码写出来,很多人都下不去手。
解析:
首先,需要定义两个变量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);
}
}
实现结果: