串的模式匹配

2022.12.10

简单的模式匹配算法

KMP算法

讲的非常好的课:木子喵的KMP

  1. 计算部分匹配值:从前1个到前n个,分别计算前缀集合和后缀集合最长的相等元素长度。

    比如char str[] ="ababa"

    前n个字符前缀后缀最长相等长度
    a{}{}0
    ab{a}{b}0
    aba{a,ab}{ba,a}1
    abab{a,ab,aba}{bab,ab,b}2
    ababa{a,ab,aba,abab}{baba,aba,ba,a}3

    部分匹配值:00123

  2. 移动位数 = 已匹配位数 - 部分匹配值

    image-20220912222643841

  3. 改进算法——Next数组

    image-20220912222908978

例题

  1. 【2015 统考真题】已知字符串S为’abaab[a]abacacaabaabcc",模式串t为'abaab[c]".采用KMP 算法进行匹配,第一次出现“失配”(S[i]≠t[j])时,i=j=5,則下次开始匹配时,i和j的值分别是()。 A. i=1, j=0 B. i=5, j=0 C. i=5, j=2 D. ¡=6, j=2

    【答案】:

    前n个字符前缀后缀最长相等长度NEXT
    a{}{}0-1
    ab{a}{b}00
    aba{a,ab}{ba,a}10
    abaa{a,ab,aba}{baa, aa,a}11
    abaab{a,ab,aba.abaa}{baab,aab,ab,b}21
    abaaba{a,ab,aba.abaa,abaab}{baaba,aaba,aba,ba,a}32

    主字符串指针不变,子字符串指针退回到next[j] = next[5] = 2,C

  2. 【2019 统考真题】设主串I='abaabaabcabaabc',模式串S'abaabc",来用 KMP算法进行模式匹配,到匹配成功时为止,在匹配过程中进行的单个字符间的比较次数是()。 A. 9 B. 10 C. 12 D. 15

    【答案】:

    [a] [b] [a] [a] [b] [a] abcabaabc,[a]baabc, 6

    abaab [a] [a] [b] [c] abaabc,ab[a]abc, 4,B