用C语言编写输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。 输出要求 输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。 输入样例 abcde a3 aaaaaa aa # 输出样例 0 3
时间: 2024-03-18 17:41:31 浏览: 26
好的,我明白了。这是一道比较经典的字符串匹配题目。我可以给你提供一个基于KMP算法的C语言实现代码,供你参考。
```c
#include <stdio.h>
#include <string.h>
#define MAX_N 1010
char pattern[MAX_N];
char text[MAX_N];
int next[MAX_N];
void getNext(char *p, int *next) {
next[0] = -1;
int i = 0, j = -1;
while (i < strlen(p)) {
if (j == -1 || p[i] == p[j]) {
i++;
j++;
next[i] = j;
} else {
j = next[j];
}
}
}
int kmp(char *t, char *p) {
getNext(p, next);
int i = 0, j = 0;
int cnt = 0;
while (i < strlen(t)) {
if (j == -1 || t[i] == p[j]) {
i++;
j++;
if (j == strlen(p)) {
cnt++;
j = next[j];
}
} else {
j = next[j];
}
}
return cnt;
}
int main() {
while (scanf("%s", pattern)) {
if (pattern[0] == '#') break;
int cnt = 0;
while (scanf("%s", text)) {
if (text[0] == '#') break;
cnt += kmp(text, pattern);
}
printf("%d\n", cnt);
}
return 0;
}
```
这段代码中,getNext函数用于计算模式串P的next数组,kmp函数用于在文本串T中查找模式串P,并返回匹配的次数。在主函数中,我们通过嵌套循环,不断地读取输入的文本串和模式串,并调用kmp函数计算匹配次数,最后输出结果即可。
需要注意的是,输入中的每个字符串都没有空格,所以我们可以直接使用scanf来读取字符串。另外,需要在最后一个输入的字符串后面加上一个#字符,表示输入结束。