用C语言和KMP写出完整代码给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。 本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下: 数据0:小规模字符串,测试基本正确性; 数据1:随机数据,String 长度为 10 5 ,Pattern 长度为 10; 数据2:随机数据,String 长度为 10 5 ,Pattern 长度为 10 2 ; 数据3:随机数据,String 长度为 10 5 ,Pattern 长度为 10 3 ; 数据4:随机数据,String 长度为 10 5 ,Pattern 长度为 10 4 ; 数据5:String 长度为 10 6 ,Pattern 长度为 10 5 ;测试尾字符不匹配的情形; 数据6:String 长度为 10 6 ,Pattern 长度为 10 5 ;测试首字符不匹配的情形。输入格式: 输入第一行给出 String,为由英文字母组成的、长度不超过 10 6 的字符串。第二行给出一个正整数 N(≤10),为待匹配的模式串的个数。随后 N 行,每行给出一个 Pattern,为由英文字母组成的、长度不超过 10 5 的字符串。每个字符串都非空,以回车结束。
时间: 2023-11-28 19:47:51 浏览: 115
以下是使用KMP算法实现字符串匹配的C语言代码:
```c
#include <stdio.h>
#include <string.h>
// 计算模式串的next数组
void getNext(char* pattern, int* next) {
int i = 0, j = -1;
next[0] = -1;
int len = strlen(pattern);
while (i < len) {
if (j == -1 || pattern[i] == pattern[j]) {
i++;
j++;
next[i] = j;
} else {
j = next[j];
}
}
}
// 查找模式串在文本串中第一次出现的位置
int KMP(char* text, char* pattern, int* next) {
int i = 0, j = 0;
int n = strlen(text);
int m = strlen(pattern);
while (i < n && j < m) {
if (j == -1 || text[i] == pattern[j]) {
i++;
j++;
} else {
j = next[j];
}
}
if (j == m) {
return i - m;
} else {
return -1;
}
}
int main() {
char text[1000001];
scanf("%s", text);
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
char pattern[100001];
scanf("%s", pattern);
int next[100001];
getNext(pattern, next);
int pos = KMP(text, pattern, next);
if (pos == -1) {
printf("Not Found\n");
} else {
printf("%s\n", text + pos);
}
}
return 0;
}
```
该代码首先输入文本串和模式串个数,然后依次输入每个模式串,对于每个模式串,计算其next数组,然后使用KMP算法在文本串中查找该模式串,并输出第一次出现的位置后的子串。如果找不到,则输出“Not Found”。
阅读全文