算法目的

​ 确定主串中所含子串(模式串)第一次出现的位置(定位)

算法应用

  • 搜索引擎、拼写检查、语言翻译、数据压缩

算法种类

  • BF算法(Brute-Force,又称古典的、经典的、朴素的、穷举的)
  • KMP算法(特点:速度快)

BF算法

Brute-Force简称为BF算法,亦称简单匹配算法。采用穷举法的思路

  • 将主串的第pos个字符和模式串的第一个字符比较
    • 若相等,继续逐个比较后续字符;
    • 若不等,从主串的下一字符起,重新与模式串的第一个字符比较。
    • 直到主串的一个连续子串字符序列和模式串相等。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。
    • 否则,匹配失败,返回值为0.
int index_BF(SString S,SString T){
    int i=1,j=1;
    while (i<=S.length &&j<=T.length){
        if(s.ch[i]==t.ch[j]){++i;++j;}//主串和子串依次匹配下一个字符
        else{i=i-j+2;j=1;}//主串、子串指针回溯重新开始下一次匹配
    }
    if(j>=T.length) return i-T.length;//返回匹配的第一个字符的下标
    else return 0;//模式匹配不成功
}
BF算法时间复杂度

例:S='0000000001',T='0001',poS=1
若n为主串长度,m为子串长度,最坏情况是

  • 主串前面n-m个位置都部分匹配到子串的最后一位,即这n-m位各比较了m次

  • 最后m位也各比较了1次

    总次数为:(n-m) * m+m=(n-m+1)*m

    若m<<n,则算法复杂度O(n*m)

KMP (Knuth Morris Pratt)算法

​ KMP算法是D.E.Knuth、J.H.Morris和V.R.Pratt共同提出的,简称KMP算法

算法设计思路:利用已经部分匹配的结果而加快模式串的滑动速度?

且主串S的指针i不必回溯!可提速到O(n+m)