BF(Brute Force)算法又叫作暴力匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。在开始讲解这个算法前先定义两个概念:主串模式串

  • 如果我们在字符串 A 中查找字符串 B,那字符串 A 就是主串,字符串 B 就是模式串
  • 我们把主串的长度记作 n,模式串的长度记作 m。因为我们是在主串中查找模式串,所以 n>m。

算法思想

而 BF 算法的思想就是,我们在主串中检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的。如下图所示。
image.png
从图中可以看出,在极端情况下,比如主串是“aaaaa…aaaaaa”,模式串是“aaaaab”。我们每次都比对 m 个字符,要比对 n-m+1 次,所以,这种算法的最坏情况时间复杂度是 O(n*m)。不过,虽然 BF 算法的时间复杂度很高,但在实际的开发中却是一个比较常用的字符串匹配算法,原因有两点:

  • 实际的软件开发中,大部分情况下,模式串和主串的长度都不会太长,且每次模式串与主串中的子串匹配的时候,当中途遇到不能匹配的字符时就可以就停止了,不需要把m个字符都比对一下。所以,尽管理论上的最坏情况时间复杂度是 O(n*m),但大部分情况下,算法执行效率要比这个高很多。
  • 暴力匹配算法思想简单,代码实现也非常简单。在工程中,在满足性能要求的前提下,简单是首选。

代码实现

  1. public static int bf(String main, String pattern) {
  2. int n = main.length();
  3. int m = pattern.length();
  4. // 主串
  5. char[] mainArray = main.toCharArray();
  6. // 模式串
  7. char[] patternArray = pattern.toCharArray();
  8. // 遍历子串
  9. for (int i = 0; i <= n - m; i++) {
  10. int k = 0;
  11. // 遍历模式串中的每个字符看是否匹配子串
  12. for (int j = 0; j < m; j++) {
  13. if (mainArray[i + j] == patternArray[j]) {
  14. k++;
  15. } else {
  16. break;
  17. }
  18. }
  19. if (k == m) {
  20. return i;
  21. }
  22. }
  23. return -1;
  24. }