BF(Brute Force)算法又叫作暴力匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。在开始讲解这个算法前先定义两个概念:主串和模式串
- 如果我们在字符串 A 中查找字符串 B,那字符串 A 就是主串,字符串 B 就是模式串
- 我们把主串的长度记作 n,模式串的长度记作 m。因为我们是在主串中查找模式串,所以 n>m。
算法思想
而 BF 算法的思想就是,我们在主串中检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的。如下图所示。
从图中可以看出,在极端情况下,比如主串是“aaaaa…aaaaaa”,模式串是“aaaaab”。我们每次都比对 m 个字符,要比对 n-m+1 次,所以,这种算法的最坏情况时间复杂度是 O(n*m)。不过,虽然 BF 算法的时间复杂度很高,但在实际的开发中却是一个比较常用的字符串匹配算法,原因有两点:
- 实际的软件开发中,大部分情况下,模式串和主串的长度都不会太长,且每次模式串与主串中的子串匹配的时候,当中途遇到不能匹配的字符时就可以就停止了,不需要把m个字符都比对一下。所以,尽管理论上的最坏情况时间复杂度是 O(n*m),但大部分情况下,算法执行效率要比这个高很多。
- 暴力匹配算法思想简单,代码实现也非常简单。在工程中,在满足性能要求的前提下,简单是首选。
代码实现
public static int bf(String main, String pattern) {int n = main.length();int m = pattern.length();// 主串char[] mainArray = main.toCharArray();// 模式串char[] patternArray = pattern.toCharArray();// 遍历子串for (int i = 0; i <= n - m; i++) {int k = 0;// 遍历模式串中的每个字符看是否匹配子串for (int j = 0; j < m; j++) {if (mainArray[i + j] == patternArray[j]) {k++;} else {break;}}if (k == m) {return i;}}return -1;}
