用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 ;测试首字符不匹配的情形。
时间: 2023-11-28 07:47:46 浏览: 89
以下是使用KMP算法实现字符串匹配的完整代码:
```c
#include <stdio.h>
#include <string.h>
void computeLPSArray(char *pat, int M, int *lps);
void KMPSearch(char *pat, char *txt);
int main()
{
char String[1000001];
char Pattern[11];
int i, j;
//输入String和Pattern
scanf("%s", String);
scanf("%s", Pattern);
//调用KMPSearch函数进行匹配
KMPSearch(Pattern, String);
return 0;
}
void computeLPSArray(char *pat, int M, int *lps)
{
int len = 0, i;
lps[0] = 0; // lps[0] is always 0
i = 1;
while (i < M)
{
if (pat[i] == pat[len])
{
len++;
lps[i] = len;
i++;
}
else // (pat[i] != pat[len])
{
if (len != 0)
{
len = lps[len - 1];
}
else // if (len == 0)
{
lps[i] = 0;
i++;
}
}
}
}
void KMPSearch(char *pat, char *txt)
{
int M = strlen(pat);
int N = strlen(txt);
// create lps[] that will hold the longest prefix suffix
// values for pattern
int lps[M];
// Preprocess the pattern (calculate lps[] array)
computeLPSArray(pat, M, lps);
int i = 0; // index for txt[]
int j = 0; // index for pat[]
while (i < N)
{
if (pat[j] == txt[i])
{
j++;
i++;
}
if (j == M)
{
printf("%d\n", i - j);
printf("%s\n", &txt[i - j + 1]);
j = lps[j - 1];
}
// mismatch after j matches
else if (i < N && pat[j] != txt[i])
{
// Do not match lps[0..lps[j-1]] characters,
// they will match anyway
if (j != 0)
j = lps[j - 1];
else
i = i + 1;
}
}
//如果没有匹配成功,输出Not Found
if (j == 0)
{
printf("Not Found\n");
}
}
```
注意:在实际使用中,需要注意输入的String和Pattern长度不能超过数组的最大长度,否则会发生数组越界错误。
阅读全文