将字符串后缀预处理成部分匹配表(PMT),在匹配过程中使用KMP算法,减少不必要的比较,提高匹配效率。具体实现代码如下:
def get_pmt(pattern: str) -> List[int]:
"""
获取部分匹配表
"""
length = len(pattern)
pmt = [0] * length
pmt[0] = -1
i, j = 0, -1
while i < length - 1:
if j == -1 or pattern[i] == pattern[j]:
i += 1
j += 1
pmt[i] = j
else:
j = pmt[j]
return pmt
def match_suffix(text: str, pattern: str) -> List[int]:
"""
匹配字符串后缀
"""
length_t = len(text)
length_p = len(pattern)
pmt = get_pmt(pattern)
i, j = 0, 0
res = []
while i < length_t:
if j == length_p:
res.append(i - length_p)
j = pmt[j]
if j == -1 or text[i] == pattern[j]:
i += 1
j += 1
else:
j = pmt[j]
if j == length_p:
res.append(i - length_p)
return res
以上代码中,get_pmt函数用于计算部分匹配表,match_suffix函数利用KMP算法匹配字符串后缀。最后返回匹配的位置列表。
上一篇:部分匹配字符串并排除其他部分
下一篇:部分匹配、追加和扩展