KMP 手書きアルゴリズム

kmpアルゴリズムを見るのはこれで3回目です。今回理解できたらここに記録しておけば、忘れても次回見返すことができます。

文字列の次の配列については、この記事を引用します https://www.acwing.com/solution/content/14666/
ここに画像の説明を挿入します
次に、次の配列を要求するコードにそれを入れるだけです。2 つを使用する必要があります。ポインター。1 つのポインターは文字列全体を走査し、もう 1 つはプレフィックスの合計の長さを処理します。
画像の説明を追加してください
画像の説明を追加してください
画像の説明を追加してください

次のコードは、メイン文字列内の最初に出現する部分文字列の開始点と終了点に一致します。

def find_next(p):
    next = [0] * (len(p)+1)
    j,k = 0,-1
    next[0] = -1  # 防止死循环 k一直等于0 j也不加
    while(j < len(p) - 1):
        if (k == -1 or p[j] == p[k]):
            j += 1
            k += 1
            next[j] = k
        else:
            k = next[k]
    next[0] = 0
    return next

if __name__ == '__main__':
    n = int(input())
    p = str(input())
    m = int(input())
    s = str(input())
    next = find_next(p)
    i = 0 # 主串中的指针
    j = 0 # 子串中的指针
    while i < len(s):
        if s[i] == p[j]:
            i += 1 
            j += 1
        elif j > 0:  # 匹配失败,根据next跳过前面的字符串
            j = next[j]
        else :  # 字符串第一个就匹配失败
            i = i + 1
        if j == len(p):
            print(i - j, i-1) # 匹配第一个字符串起始和终点
            break

おすすめ

転載: blog.csdn.net/abc1234564546/article/details/129194249