字符串匹配题,思路很简单,分别统计每个Excuse中的匹配单词数量,输出最多的句子即可。但是一些细节需要注意
比如说对于如下案例
1 2
hao
nihao
ni hao
(1) 应该输出ni hao,因为题目中要求必须是分割的单词匹配,不是子串匹配。
(2) 注意以字符结尾的时候,怎么存储最后一个单词。比如上例ni hao没有结束符号,以字符结尾,容易忽视最后一个单词。
代码如下:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
int K,L;
char key[21][20];//key words
char exc[21][100];//Excuse
char word[21];//临时存储Excuse中的单词
int cnt[21];//记录每条Excuse中
int Judge(char str[])
{
int i,j,k=0;
int number=0;
for(i=0;;i++)
{
if(isalpha(str[i])) word[k++]=tolower(str[i]);
else if(!isalpha(i))
{
word[k]='\0';
k=0;
//puts(word);
for(int t=0;t<K;t++){
if(strcmp(word,key[t])==0) number++;
else continue;
}
if(str[i]=='\0') break;//将跳出循环的判断放到这里,当以字符为结尾的Excuse,可以存储最后一个单词
}
}
return number;
}
int main()
{
int i,j,cases=1;
while(scanf("%d %d",&K,&L)!=EOF)
{
for(i=0;i<K;i++) scanf("%s",key[i]);
getchar();
for(i=0;i<L;i++){
gets(exc[i]);
cnt[i]=Judge(exc[i]);
}
printf("Excuse Set #%d\n",cases);
int max=-1;
for(i=0;i<L;i++)
if(cnt[i]>max) max=cnt[i];
for(i=0;i<L;i++)
if(cnt[i]==max) printf("%s\n",exc[i]);
printf("\n");
cases++;
}
return 0;
}