bitmori / neonmori.github.io

このノートに書き下ろし、星空で巡ってく
1 stars 0 forks source link

KMP算法 #28

Open bitmori opened 4 years ago

bitmori commented 4 years ago

KMP 關鍵在於跳轉表

next[i] = len(p[0..<i]的最長prefix同時也是suffix)

len(next) = len(p) + 1

bitmori commented 4 years ago
def build(p):
    m = len(p)
    nxt = [0, 0]
    j = 0
    for i in range(1, m):
        while j > 0 and p[i] != p[j]:
            j = nxt[j]
        if p[i] == p[j]:
            j += 1
        nxt.append(j)
    return nxt

def kmp(s, p):
    res = []
    nxt = build(p)
    j = 0
    for i in range(len(s)):
        while j > 0 and s[i] != p[j]:
            j = nxt[j]
        if s[i] == p[j]:
            j += 1
        if j == len(p):
            res.append(i - j + 1)
            j = nxt[j]
    return res