【考研代码笔记】数据结构

142 阅读1分钟

【数据结构学习笔记】4.2串的匹配模式

1.朴素模式匹配算法

  • 字符串模式匹配:在主串中找到与模式串相同的子串,并返回其所在位置。

    主串:‘abaabbbammnaaannnjaa’

    模式串:'aabb'

    [key]:子串是主串的一部分,一定存在;模式串,不一定能在主串中找到。
  • 主串长度为n,模式串长度为m

    朴素模式匹配算法:将主串中所有长度为m的子串依次与模式串对比,直到找到一个完全匹配的子串或所有的子串都不匹配为止。(暴力)--->Index(S,T)

image.png

int Index(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;
} 
最坏时间复杂度=O(nm)
最坏的情况,每个子串都要对比m个字符,共n-m+1个子串,复杂度=O((n-m+1)m)=O(nm),因为很多时候n>>m

2.KMP算法

  • 基本算法示意图

image.png

模式串指针始终指向下一个需要比较的元素。
  • 优化特性:主串指针不"回溯"
  • 原理:
    • 根据模式串T,求出next数组
    • 利用next数组进行匹配(主串指针不回溯)
  • 最坏时间复杂度=O(n+m)
  • next数组时间复杂度O(m)
  • 模式匹配过程最坏时间复杂度为O(n)

3.求模式串的next数组(手算练习)

image.png image.png image.png