字符串的模式匹配: BF算法

Posted xlxxcc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串的模式匹配: BF算法相关的知识,希望对你有一定的参考价值。

  暴风(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。
  BF算法是一种蛮力算法。蛮力搜索,比较简单的一种字符串匹配算法,在处理简单的数据时候就可以用这种算法,完全匹配,就是速度慢啊。

基本思想

  从目标串s 的第一个字符起和模式串t的第一个字符进行比较,若相等,则继续逐个比较后续字符,否则从串s的第二个字符起再重新和串t进行比较。
  依此类推,直至串t 中的每个字符依次和串s的一个连续的字符序列相等,则称模式匹配成功,此时串t的第一个字符在串s 中的位置就是t 在s中的位置,否则模式匹配不成功
  首先S[1]和T[1]比较,若相等,则再比较S[2]和T[2],一直到T[M]为止;若S[1]和T[1]不等,则S向右移动一个字符的位置,再依次进行比较。如果存在k,1≤k≤N,且S[k+1…k+M]=T[1…M],则匹配成功;否则失败。
该算法最坏情况下要进行M*(N-M+1)次比较,时间复杂度为O(M*N)。

举例说明:

S: ababcabcacbab
T: abcac

BF算法匹配的步骤如下图:

伪码

  1. 首先设定 S 和 T 的起始比较下标 i 和 j;
  2. 循环直到 i+m>n 或者T中的字符都比较完(j==m)
    2.1 如果S[i]==T[j], 继续比较S和T的下一个字符,否则
    2.2 将 i 和 j 回溯,准备下一轮比较
  3. 如果T中的字符都比较完(j==m),则返回比较的起始下标
    否则返回-1,表示匹配失败

具体实现:

int strStr(const char *S, const char *T)  
     if(S==NULL||T==NULL) return -1;  
     int n = strlen(S);  
     int m = strlen(T);  
     int i=0;  
     while( i+m<=n)  
          int k=i, j=0;  
          for(; j<m&&k<n&&S[k]==T[j]; ++k,++j) ;  
          if(j==m) return i;  //  匹配成功,返回比较开始位置  
          ++i;  
       
     return -1;   // 匹配失败  
 

以上是关于字符串的模式匹配: BF算法的主要内容,如果未能解决你的问题,请参考以下文章

字符串的模式匹配: BF算法

常用算法3 - 字符串查找/模式匹配算法(BF & KMP算法)

字符串模式匹配中的BF算法与KMP算法

字符串匹配算法(BF算法&&KMP算法)

BF字符串匹配算法

Python怎么实现模式匹配?