这道题的难点在于输入的处理,值得采用的方法是使用一个flag变量进行字符串的分离操作。代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INALP 1
#define OUTALP 0
char e[21][100]; //关键字符串
char k[21][100]; //Excuse语句
char t[71]; //Excuse语句中的单个单词
int cnt[25]; //每个语句的关键词个数
int m, n;
/*对每个语句中的每个单词进行比对,返回是否匹配*/
int cmp_s(char *s){
int i, j;
for(i = 0; i < m; ++i){
if(!strcmp(s, e[i])) return 1;
}
return 0;
}
/*分离出语句中的每个单词并进行比对,返回匹配的个数*/
int trim(char *s){
int len, i, j, dk;
int flag = OUTALP;
int cot = 0;
len = strlen(s);
j = 0;
for(i = 0; i < len; ++i){
if(flag == INALP && ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <='Z'))){
t[j++] = s[i] >= 'A' && s[i] <= 'Z' ? s[i] - 'A' + 'a' : s[i];
}
if(flag == INALP && !((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <='Z'))){
flag = OUTALP;
if(cmp_s(t)) cot++;
memset(t, 0, sizeof(t));
j = 0;
}
if(flag == OUTALP && ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <='Z'))){
flag = INALP;
t[j++] = s[i] >= 'A' && s[i] <= 'Z' ? s[i] - 'A' + 'a' : s[i];
}
}
return cot;
}
int main(){
int i, j;
int g, mi;
j = 1;
while(scanf("%d%d", &m, &n) != EOF){
memset(e, 0, sizeof(e));
memset(k, 0, sizeof(k));
for(i = 0; i < m; ++i){
scanf("%s", e[i]);
}
getchar();
for(i = 0; i < n; ++i){
gets(k[i]);
g = trim(k[i]);
cnt[i] = g;
}
mi = 0;
for(i = 0; i < n; ++i){
if(mi <= cnt[i]) mi = cnt[i];
}
printf("Excuse Set #%d\n", j);
for(i = 0; i < n; ++i){
if(cnt[i] == mi) puts(k[i]);
}
printf("\n");
j++;
}
return 0;
}