用C语言实现KMP算法来计算一个字符串在另一个字符串中首次出现的位置’
时间: 2023-06-24 14:03:13 浏览: 122
KMP算法,求子字符串位置
3星 · 编辑精心推荐
KMP算法是一种字符串匹配算法,用于求解字符串中的模式串在文本串中的首次出现位置。下面是用C语言实现KMP算法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get_next(char *p, int *next)
{
int i = 0, j = -1;
next[0] = -1;
while (p[i] != '\0') {
if (j == -1 || p[i] == p[j]) {
i++;
j++;
next[i] = j;
} else {
j = next[j];
}
}
}
int kmp_search(char *s, char *p, int *next)
{
int i = 0, j = 0;
while (s[i] != '\0' && p[j] != '\0') {
if (j == -1 || s[i] == p[j]) {
i++;
j++;
} else {
j = next[j];
}
}
if (p[j] == '\0') {
return i - j;
} else {
return -1;
}
}
int main()
{
char s[100], p[100];
int next[100];
printf("input string s: ");
scanf("%s", s);
printf("input string p: ");
scanf("%s", p);
get_next(p, next);
int pos = kmp_search(s, p, next);
if (pos == -1) {
printf("can't find string p in string s\n");
} else {
printf("string p first appears in string s at position %d\n", pos);
}
return 0;
}
```
代码中的 `get_next` 函数用于求解模式串 `p` 的 next 数组,`kmp_search` 函数用于在文本串 `s` 中查找模式串 `p`。函数的具体实现可以参考KMP算法的原理,这里不再赘述。
输入字符串 `s` 和 `p` 后,程序会先求解 `p` 的 next 数组,然后在 `s` 中查找 `p` 的位置。如果找到了,程序会输出 `p` 在 `s` 中首次出现的位置;如果没有找到,程序会输出提示信息。
阅读全文