📜  模式搜索的KMP算法(1)

📅  最后修改于: 2023-12-03 15:26:51.066000             🧑  作者: Mango

模式搜索的KMP算法

简介

KMP算法是一种字符串匹配算法,用于在一个文本串中找到一个模式串的出现位置。它的特点在于不回溯文本串中已经匹配过的字符,从而提高了匹配效率。KMP算法的时间复杂度为O(n+m),其中n为文本串长度,m为模式串长度。

实现原理

KMP算法的实现基于一种叫做“部分匹配表”的数据结构。部分匹配表存储了模式串中每个字符前缀的最长前缀后缀相同的长度,用于在匹配失败时快速移动模式串。

例如,对于模式串“ABCDABD”,它的部分匹配表为:

| 字符串 | 长度 | 最长前缀后缀相同的长度 | |--------|------|------------------------| | A | 1 | 0 | | AB | 2 | 0 | | ABC | 3 | 0 | | ABCD | 4 | 0 | | ABCDA | 5 | 1 | | ABCDAB | 6 | 2 | | ABCDABD| 7 | 0 |

代码示例

下面是使用Python实现KMP算法的示例代码:

def kmp_search(text, pattern):
    n = len(text)
    m = len(pattern)
    if m == 0:
        return 0
    next = get_next(pattern)
    j = 0
    for i in range(n):
        while j > 0 and text[i] != pattern[j]:
            j = next[j - 1]
        if text[i] == pattern[j]:
            j += 1
        if j == m:
            return i - m + 1
    return -1
    
def get_next(pattern):
    m = len(pattern)
    next = [0] * m
    j = 0
    for i in range(1, m):
        while j > 0 and pattern[i] != pattern[j]:
            j = next[j - 1]
        if pattern[i] == pattern[j]:
            j += 1
        next[i] = j
    return next

其中,kmp_search函数是KMP算法的主体部分,get_next函数用于生成部分匹配表。

使用方法

使用KMP算法匹配文本串与模式串的方法非常简单,只需要调用kmp_search函数即可,例如:

text = 'ABCABCDABD'
pattern = 'ABCDABD'
index = kmp_search(text, pattern)
if index != -1:
    print('Pattern found at index', index)
else:
    print('Pattern not found')
总结

通过KMP算法,我们可以快速地匹配文本串与模式串,而且不会回溯已经匹配过的字符,大大提高了匹配效率。KMP算法的代码实现并不复杂,在理解了部分匹配表后即可轻松掌握。