kmp算法Pyhton
时间: 2023-10-29 22:54:02 浏览: 57
在Python中实现KMP算法的关键是通过next()函数计算出k值,这样就可以避免每次只移动一个元素并重新从0开始匹的朴素算法的缺点。以下是一个示例的KMP算法的实现:
```python
def getNext(pattern):
n = len(pattern)
next = [0 * n
i, j = 0, -1
next = -1
while i < n - 1:
if j == -1 or pattern[i == pattern[j]:
i += 1
j += 1
next[i = j
else:
j = next[j]
return next
def kmpSearch(text, pattern):
m, n = len(text), len(pattern)
i, j = 0, 0
next = getNext(pattern)
while i < m and j < n:
if j == -1 or text[i == pattern[j]:
i += 1
j += 1
else:
j = next[j]
if j == n:
return i - j
else:
相关问题
kmp算法acwing
KMP算法,全称为Knuth-Morris-Pratt算法,是由Donald Knuth、James Morris和Vance Pratt在1970年代独立开发的一种字符串匹配算法。它是一种高效的模式匹配算法,用于在一个文本串中查找指定的子串。与朴素的线性搜索相比,KMP算法具有更好的时间复杂度,能在最坏情况下达到O(n + m),其中n是文本串的长度,m是子串的长度。
在ACWing这样的编程教育平台上,KMP算法通常作为数据结构和算法中的高级主题进行讲解,因为理解并实现它需要对动态规划和状态转移的思想有深入的理解。以下是KMP算法的一些关键概念:
1. **部分匹配表(Partial Match Table, PMT)**:这是KMP算法的核心,是一个预先计算好的数组,用于存储模式串的前缀和后缀公共部分的长度,帮助我们在匹配过程中避免无效的字符比较。
2. **状态转移**:算法会根据PMT找到当前字符和目标串中上一个成功匹配字符的位置差值,决定下一步匹配的位置,减少了回溯的次数。
3. **失败跳转**:如果遇到不匹配的字符,我们不是直接后移一位,而是根据PMT信息跳过一定位置,避免了重复搜索已经匹配过的部分。
使用kmp算法
好的,下面我来为您讲解使用KMP算法解决字符串匹配问题的方法。
KMP算法是一种比较高效的字符串匹配算法,它的核心思想是利用已经匹配过的信息,尽可能减少不必要的字符比较次数,从而提高匹配效率。具体实现时,KMP算法利用前缀和后缀的概念,对于每个字符,计算出它的最长前缀和最长后缀的匹配长度,然后根据这些信息来移动模式串,从而减少比较次数。
下面是使用KMP算法解决字符串匹配问题的代码实现:
```python
def str_str(s, n):
if not n:
return 0
if not s:
return -1
m, k = len(s), len(n)
next = get_next(n)
i = j = 0
while i < m and j < k:
if j == -1 or s[i] == n[j]:
i += 1
j += 1
else:
j = next[j]
if j == k:
return i - k
else:
return -1
def get_next(n):
k, j = -1, 0
next = [-1] * len(n)
while j < len(n) - 1:
if k == -1 or n[k] == n[j]:
k += 1
j += 1
next[j] = k
else:
k = next[k]
return next
```
需要注意的是,KMP算法中的next数组表示的是模式串中每个位置的最长前缀和最长后缀的匹配长度,而不是暴力匹配算法中的每个位置的最长前缀和最长后缀。因此,KMP算法中的next数组需要先计算出来,然后再根据它来移动模式串。
接下来,我来给您提供一组测试用例,证明KMP算法的正确性:
```python
assert str_str("hello", "ll") == 2
assert str_str("aaaaa", "bba") == -1
assert str_str("mississippi", "issip") == 4
```
这些测试用例可以验证KMP算法的正确性。相比暴力匹配算法,KMP算法的时间复杂度为O(m+n),可以在较短的时间内解决字符串匹配问题。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)