kmp算法next计算方法
时间: 2023-08-26 07:12:16 浏览: 128
KMP算法(Knuth-Morris-Pratt算法)是一种字符串匹配算法,它的核心是通过预处理模式串,利用已知信息来尽量减少无效的字符比较次数。其中,next数组是KMP算法的重要部分,它记录了模式串中每个前缀的最长相同前缀后缀长度。
next数组的计算方法如下:
1. 初始化:next[0] = -1,next[1] = 0。
2. i从2到n,依次计算next[i]的值:
a. 如果p[i-1] == p[next[i-1]],那么next[i] = next[i-1] + 1;
b. 否则,递归地比较p[i-1]和p[next[next[i-1]]],直到找到一个j,使得p[i-1] == p[next[j]] 或者j == 0。此时,next[i] = j。
其中,p是模式串,n是模式串的长度。
相关问题
kmp算法next计算方法讲解
KMP算法的next数组计算方法是关键的一步,它用于在模式串和主串不匹配时,快速地跳过一些已经匹配的字符,从而提高匹配效率。下面是next数组的计算方法:
1. 首先,next[0]赋值为-1,next赋值为0。
2. 然后,从i=2开始,依次计算next[i]的值。
3. 对于next[i]的计算,需要用到前面已经计算出来的next、next、...、next[i-1]的值。
4. 假设已经计算出了next、next、...、next[i-1]的值,现在要计算next[i]的值。
5. 首先,将next[i]赋值为0。
6. 然后,从next[i-1]开始,依次向前查找前缀和后缀是否相等。
7. 如果相等,则将next[i]的值赋为相等的长度。
8. 如果不相等,则继续向前查找,直到找到next[j]=-1或者前缀和后缀相等为止。
9. 如果找到了前缀和后缀相等的位置,将next[i]的值赋为相等的长度。
10. 如果一直查找到next[j]=-1都没有找到前缀和后缀相等的位置,将next[i]的值赋为0。
11. 最后,返回计算出来的next数组。
kmp算法next计算方法C语言,KMP(next)算法c语言实现
KMP算法中的next数组计算方法如下:
```c
void getNext(char *p, int *next) {
int pLen = strlen(p);
next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen - 1) {
if (k == -1 || p[j] == p[k]) {
++j;
++k;
if (p[j] != p[k]) {
next[j] = k;
} else {
next[j] = next[k];
}
} else {
k = next[k];
}
}
}
```
KMP算法的C语言实现如下:
```c
#include <stdio.h>
#include <string.h>
void getNext(char *p, int *next);
int kmp(char *s, char *p);
int main() {
char s[100], p[100];
printf("请输入主串:");
scanf("%s", s);
printf("请输入模式串:");
scanf("%s", p);
int pos = kmp(s, p);
if (pos == -1) {
printf("未找到匹配的子串\n");
} else {
printf("匹配的子串起始位置为:%d\n", pos);
}
return 0;
}
void getNext(char *p, int *next) {
int pLen = strlen(p);
next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen - 1) {
if (k == -1 || p[j] == p[k]) {
++j;
++k;
if (p[j] != p[k]) {
next[j] = k;
} else {
next[j] = next[k];
}
} else {
k = next[k];
}
}
}
int kmp(char *s, char *p) {
int sLen = strlen(s);
int pLen = strlen(p);
int next[pLen];
getNext(p, next);
int i = 0, j = 0;
while (i < sLen && j < pLen) {
if (j == -1 || s[i] == p[j]) {
++i;
++j;
} else {
j = next[j];
}
}
if (j == pLen) {
return i - j;
} else {
return -1;
}
}
```
阅读全文