字符串匹配算法
1、字符串匹配
假设有两个串(其中 t i t_i ti、 p j p_j pj是字符):
t = t 0 t 1 t 2 ⋯ t n − 1 t=t_0t_1t_2\cdots t_{n-1} t=t0t1t2⋯tn−1
p = p 0 p 1 p 2 ⋯ p m − 1 p=p_0p_1p_2\cdots p_{m-1} p=p0p1p2⋯pm−1
字符串查找就是在 t t t(目标串)中查找与 p p p(模式串)相同的字串的操作或过程。一般来说,模式串的长度远小于目标串的长度,即m<<n。
2、字符串匹配算法
1、朴素串匹配算法(BF算法)
最简单的朴素匹配算法采用最直观可行的策略:从左到右逐个字符匹配,当发现不匹配时,转去考虑目标串里的下一个位置是否与模式串匹配。
#只找到第一个匹配串在目标串中的位置
def naive_matching(t,p):
i,j = 0,0
n,m = len(t),len(p)
while i < n and j < m :
if t[i] == p[j]:
i,j = i + 1, j + 1
else:
i,j = i -j + 1,0
if j == m:
return i - j
return -1
#找到所有匹配串在目标串中的位置
def naive_matching(t,p):
i,j = 0,0
n,m = len(t),len(p)
list = []
while i < n :
if j < m:
if t[i] == p[j]:
i,j = i + 1, j + 1
else:
i,j = i -j + 1,0
if j == m:
list.append(i - j)
i,j = i - j + 1,0
if len(list) > 0:
return list
return -1
2、无回溯串匹配算法( K M P KMP KMP算法)
1、问题分析
-
K M P KMP KMP算法的基本思想就是匹配中不回溯,如果匹配中出现不匹配的字符时( p i ≠ t j p_i\neq t_j pi=tj),就找到某个特定的 k i k_i k