字符串匹配算法——BF算法(暴力匹配)

字符串匹配算法——BF算法(Brute Force)

欢迎关注个人公众号:程序员宅急送
公众号微信号:Geek_Zhai

核心思想:

假设我们主串长度为n,模串长度为m,BF算法就是要去遍历主串的n个字符,每次都再循环比对n-m+1个字符,所以时间复杂度是n*m;

原理如下图:

在这里插入图片描述

代码如下:
class Solution
{
public:
  int BF(const string& src,const string& dst)
  {
      int srcLength = src.size();
      int dstLength = dst.size();
      int count = srcLength-dstLength+1;
      bool flag =true;
      for(int i =0;i<count;++i)
      {
          flag =true;
          if(src[i]==dst[0])
          {
              for(int j=1;j<dstLength;++j)
              {
                  if(src[i+j]!=dst[j])
                  {
                      flag=false;
                      break;
                  }
              }
              if(flag)
              {
                  return i;
              }
          }

      }
      return -1;
  }
};
### BF算法与KMP算法的实现方式 #### BF算法 暴力匹配BF算法是一种简单的字符串匹配方法。该算法通过逐一比较主串和模式串中的字符来查找匹配项。具体来说,在每次不匹配的情况下,主串指针会回溯到上一次匹配起始位置之后的一个新位置,而模式串则重新从头开始匹配[^2]。 ```java public boolean bf(String text, String pattern) { int n = text.length(); int m = pattern.length(); for (int i = 0; i <= n - m; ++i) { int j; for (j = 0; j < m && pattern.charAt(j) == text.charAt(i + j); ++j); if (j == m) return true; // 找到了完整的匹配 } return false; } ``` #### KMP算法 相比之下,KMP算法利用了部分匹配的信息以避免不必要的重复扫描。当遇到不匹配的情况时,不是简单地将主串指针向前推进一位并重置模式串指针至开头,而是依据预先计算好的`next`数组调整模式串的位置继续尝试匹配。这样可以显著减少比较次数,提高效率[^3]。 ```java public class KMP { private static final void computeLPSArray(char[] pat, int M, int lps[]) { int length = 0; // 长度 of the previous longest prefix suffix int i = 1; lps[0] = 0; // LPS 的第一个值总是 0 while (i < M) { if (pat[i] == pat[length]) { length++; lps[i] = length; i++; } else { if (length != 0) { length = lps[length - 1]; } else { lps[i] = 0; i++; } } } } public static int KMPSearch(String txt, String pat) { int N = txt.length(), M = pat.length(); char T[] = txt.toCharArray(); char P[] = pat.toCharArray(); int lps[] = new int[M]; /* Preprocess the pattern */ computeLPSArray(P, M, lps); int i = 0; // index for txt[] int j = 0; // index for pat[] while ((N - i) >= (M - j)) { if (P[j] == T[i]) { j++; i++; } if (j == M) { System.out.println("Found pattern at index " + (i-j)); j = lps[j-1]; } // mismatch after j matches else if (i < N && P[j] != T[i]) { // Do not match lps[0..lps[j-1]] characters, // they will match anyway if (j != 0) j = lps[j-1]; else i = i+1; } } return -1; } } ``` ### 性能对比 对于最坏情况下的时间复杂度而言: - **BF算法**: O(n * m),其中n为主串长度,m为模式串长度。这是因为每当发生失配时,都需要回到之前的状态重新开始比较。 - **KMP算法**: O(n + m),因为预处理阶段构建`next`数组的时间开销是O(m),而在实际搜索过程中每个字符最多只会被访问两次——一次作为主串的一部分,另一次可能是在模式串内参与比较。因此整体性能更优。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值