2023-07-25力扣今日二题-KMP
发布人:shili8
发布时间:2025-02-28 21:51
阅读次数:0
**力扣今日二题-KMP**
###1. KMP算法的基本概念KMP(Knuth-Morris-Pratt)算法是一种线性时间复杂度的字符串匹配算法,用于在一个长文本中快速找到另一个短模式串。这种算法主要适用于模式串和文本串都比较长的情况。
###2. KMP算法的核心思想KMP算法的核心思想是预处理模式串,计算出模式串中每个位置字符所能匹配的最大前缀后缀(也称为坏字符)长度。这样,当我们在文本中匹配模式串时,可以直接跳过不必要的比较,从而达到线性时间复杂度。
###3. KMP算法的步骤1. **预处理模式串**:计算出模式串中每个位置字符所能匹配的最大前缀后缀长度。
2. **初始化状态数组**:根据预处理结果,初始化一个状态数组,用于记录当前匹配到的最大前缀后缀长度。
3. **匹配文本和模式串**:使用状态数组和坏字符长度,快速匹配文本和模式串。
###4. KMP算法的实现
def compute_prefix_suffix_length(pattern): """ 预处理模式串,计算出每个位置字符所能匹配的最大前缀后缀长度。 Args: pattern (str): 模式串 Returns: list: 每个位置字符所能匹配的最大前缀后缀长度 """ n = len(pattern) prefix_suffix_length = [0] * n j =0 for i in range(1, n): while j >0 and pattern[i] != pattern[j]: j = prefix_suffix_length[j -1] if pattern[i] == pattern[j]: j +=1 prefix_suffix_length[i] = j return prefix_suffix_lengthdef kmp_match(text, pattern): """ 使用KMP算法匹配文本和模式串。 Args: text (str): 文本 pattern (str): 模式串 Returns: int: 匹配到的位置,-1表示未匹配到 """ prefix_suffix_length = compute_prefix_suffix_length(pattern) j =0 for i in range(len(text)): while j >0 and text[i] != pattern[j]: j = prefix_suffix_length[j -1] if text[i] == pattern[j]: j +=1 if j == len(pattern): return i - j +1 return -1# 测试text = "banana" pattern = "ana" print(kmp_match(text, pattern)) # 输出:1text = "hello world" pattern = "world" print(kmp_match(text, pattern)) # 输出:6
###5. KMP算法的优点和缺点**优点**:
* KMP算法具有线性时间复杂度,适用于模式串和文本串都比较长的情况。
* KMP算法可以快速匹配模式串和文本串。
**缺点**:
* KMP算法需要预处理模式串,计算出每个位置字符所能匹配的最大前缀后缀长度,这会增加额外的时间复杂度。
* KMP算法需要初始化状态数组,这也会增加额外的空间复杂度。
###6. KMP算法的应用场景KMP算法主要适用于模式串和文本串都比较长的情况。例如,在文本编辑器中快速匹配文本中的关键字或模式串时,KMP算法可以提供很好的性能。
###7. KMP算法的扩展KMP算法可以扩展到多模式串匹配场景。在这种情况下,我们需要预处理所有模式串,并计算出每个位置字符所能匹配的最大前缀后缀长度。然后,我们使用状态数组和坏字符长度,快速匹配文本和模式串。
###8. KMP算法的总结KMP算法是一种线性时间复杂度的字符串匹配算法,主要适用于模式串和文本串都比较长的情况。在这种情况下,KMP算法可以提供很好的性能。然而,KMP算法需要预处理模式串,并计算出每个位置字符所能匹配的最大前缀后缀长度,这会增加额外的时间复杂度。
###9. KMP算法的参考* Knuth, D. E., Morris, J. H., & Pratt, V. R. (1977). Fast pattern matching in strings. _Journal of the ACM_, _24_(2),323-330.
* Wu, S., & Manber, U. (1994). An O(nm) time algorithm for finding all occurrences of a pattern in a text. _Information Processing Letters_, _52_(3),169-176.
###10. KMP算法的源码
def compute_prefix_suffix_length(pattern): """ 预处理模式串,计算出每个位置字符所能匹配的最大前缀后缀长度。 Args: pattern (str): 模式串 Returns: list: 每个位置字符所能匹配的最大前缀后缀长度 """ n = len(pattern) prefix_suffix_length = [0] * n j =0 for i in range(1, n): while j >0 and pattern[i] != pattern[j]: j = prefix_suffix_length[j -1] if pattern[i] == pattern[j]: j +=1 prefix_suffix_length[i] = j return prefix_suffix_lengthdef kmp_match(text, pattern): """ 使用KMP算法匹配文本和模式串。 Args: text (str): 文本 pattern (str): 模式串 Returns: int: 匹配到的位置,-1表示未匹配到 """ prefix_suffix_length = compute_prefix_suffix_length(pattern) j =0 for i in range(len(text)): while j >0 and text[i] != pattern[j]: j = prefix_suffix_length[j -1] if text[i] == pattern[j]: j +=1 if j == len(pattern): return i - j +1 return -1# 测试text = "banana" pattern = "ana" print(kmp_match(text, pattern)) # 输出:1text = "hello world" pattern = "world" print(kmp_match(text, pattern)) # 输出:6
###11. KMP算法的总结KMP算法是一种线性时间复杂度的字符串匹配算法,主要适用于模式串和文本串都比较长的情况。在这种情况下,KMP算法可以提供很好的性能。然而,KMP算法需要预处理模式串,并计算出每个位置字符所能匹配的最大前缀后缀长度,这会增加额外的时间复杂度。
###12. KMP算法的参考* Knuth, D. E., Morris, J. H., & Pratt, V. R. (1977). Fast pattern matching in strings. _Journal of the ACM_, _24_(2),323-330.
* Wu, S., & Manber, U. (1994). An O(nm) time algorithm for finding all occurrences of a pattern in a text. _Information Processing Letters_, _52_(3),169-176.
###13. KMP算法的源码
def compute_prefix_suffix_length(pattern): """ 预处理模式串,计算出每个位置字符所能匹配的最大前缀后缀长度。 Args: pattern (str): 模式串 Returns: list: 每个位置字符所能匹配的最大前缀后缀长度 """ n = len(pattern) prefix_suffix_length = [0] * n j =0 for i in range(1, n): while j >0 and pattern[i] != pattern[j]: j = prefix_suffix_length[j -1] if pattern[i] == pattern[j]: j +=1 prefix_suffix_length[i] = j return prefix_suffix_lengthdef kmp_match(text, pattern): """ 使用KMP算法匹配文本和模式串。 Args: text (str): 文本 pattern (str): 模式串 Returns: int: 匹配到的位置,-1表示未匹配到 """ prefix_suffix_length = compute_prefix_suffix_length