⚠️ 模式越长,暴力涨多少
同一段文本(24 个 a),模式分别是 4、6、8 个 a。数一数暴力各比了多少次:
T24 = "a" * 24
def brute_cmp(t, p):
c = 0
for i in range(len(t) - len(p) + 1):
j = 0
while j < len(p):
c += 1
if t[i + j] != p[j]:
break
j += 1
return c
def build_next(p):
f = [0] * len(p)
k = 0
for i in range(1, len(p)):
while k and p[i] != p[k]:
k = f[k - 1]
if p[i] == p[k]:
k += 1
f[i] = k
return f
def kmp_cmp(t, p):
f = build_next(p)
c = 0
k = 0
for i in range(len(t)):
while k and t[i] != p[k]:
k = f[k - 1]
c += 1
c += 1
if t[i] == p[k]:
k += 1
if k == len(p):
k = f[k - 1]
return c
print("/".join(str(brute_cmp(T24, "a" * m)) for m in (4, 6, 8)))
全部评论