kmp算法next数组python
时间: 2023-07-20 15:18:42 浏览: 151
KMP算法的next数组在字符串匹配中非常重要,它可以帮助我们快速移动模式串的指针,提高匹配效率。
下面是KMP算法next数组的Python实现:
```python
def get_next(p):
"""
计算next数组
"""
n = len(p)
next = [0] * n
j = 0
for i in range(1, n):
while j > 0 and p[i] != p[j]:
j = next[j-1]
if p[i] == p[j]:
j += 1
next[i] = j
return next
```
其中,p表示模式串,next数组的长度与模式串的长度相同,next[i]表示模式串中前i个字符的最长公共前后缀的长度。
该函数的实现过程为:从第二个字符开始遍历模式串,利用while循环找到当前字符的最长公共前后缀的长度,然后将该长度赋值给next数组中对应的位置。
注意,当p[i]不等于p[j]时,需要利用next[j-1]来更新j的值,因为next[j-1]表示的是p[0:j]的最长公共前后缀的长度,而p[0:j]与p[1:i]的最长公共前后缀的长度是相同的。
相关问题
kmp算法next计算方法_【数据结构——串】KMP算法——next数组Python的实现方式
KMP算法中的next数组是用来记录模式串中前缀和后缀的最长公共部分的长度的数组。计算next数组的方法如下:
1. 初始化:next[0] = -1,i = 0,j = -1。
2. 进入循环,判断 i 是否小于模式串的长度,若小于则执行循环体,否则退出循环。
3. 在循环体中,首先判断 j 是否等于-1或者当前字符等于模式串中的字符 j,若满足条件则 i 和 j 同时加1。
4. 若不满足条件,则将 j 更新为 next[j],直到满足条件。
5. 更新 next[i] 为 j。
6. 返回 next 数组。
下面是Python实现代码:
```python
def get_next(pattern):
n = len(pattern)
next_arr = [-1] * n
i, j = 0, -1
while i < n - 1:
if j == -1 or pattern[i] == pattern[j]:
i += 1
j += 1
next_arr[i] = j
else:
j = next_arr[j]
return next_arr
```
注意,该算法中的模式串下标从0开始。
kmp的next数组的算法
KMP算法中的next数组是用于在模式串中发生不匹配时,快速确定下一次匹配的位置。算法如下:
1. 初始化两个指针,i和j,分别指向模式串的第一个字符和第二个字符。
2. 创建一个长度为模式串长度的数组next,并将第一个元素next[0]设置为-1。
3. 在循环中,判断当前字符和前一个字符是否相等:
- 如果相等,将next[j]设置为i,并将i和j都向后移动一位。
- 如果不相等,将j更新为next[j],直到找到相等的字符或j等于-1为止。
4. 重复步骤3,直到遍历完整个模式串。
下面是该算法的示例代码(使用Python实现):
```python
def get_next(pattern):
n = len(pattern)
next = [-1] * n
i = 0
j = -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
```
该算法的时间复杂度为O(m),其中m是模式串的长度。这个next数组可以在KMP算法中用于加速字符串匹配过程。
阅读全文