就是问每一行有多少keywords,重复的keywords可以累加。但如果keywords是某个单词的子串就不行,如keyword "abc" 在句子 " yj aabcc"中是没有的。换句话说,就是要完全匹配。
数据很小,暴力就能过。
#include <iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
char key[30][30];
char str[25][100];
int re[25];
bool excuse(int c,int a,int b) //判断是否完全匹配
{ //c:第几个句子 a:当前句子中的位置 b:第几个keyword
int i = 1;
for(i = 1;i < strlen(key[b]);i++)
{
if(str[c][a+i] == key[b][i] || str[c][a+i] +32 == key[b][i]) continue;
else return false;
}
if(str[c][a+i] >= 65 && str[c][i] <= 122) //在‘A'到’z'之间
{
return false;
}
else return true;
}
int main()
{
int k,e;
int cnt = 1;
while(scanf("%d %d",&k,&e)!=EOF)
{
int max = 0;
memset(re,0,sizeof(re));
for(int i = 0 ;i < k;i++)
{
scanf("%s",key[i]);
}
getchar();
for(int i = 0;i < e;i++)
str[i][0] = ' '; //把每个句子第0位置为空
for(int i = 0; i < e;i++)
cin.getline(str[i]+1,100); //读取完整一行
for(int i =0 ;i < e;i++)
{
int j = 0;
while(j < strlen(str[i]))
{
while(str[i][j] >= 65 && str[i][j] <= 122) //当没有读到下一个单词时
j++;
j++;
for(int m = 0; m < k;m++)
{
if(str[i][j] == key[m][0] || str[i][j] + 32 == key[m][0])
{
if(excuse(i,j,m))
{
re[i]++;
j+=(strlen(key[m])-1);
continue;
}
}
}
}
if(re[i] >= max) max = re[i];
}
printf("Excuse Set #%d\n",cnt++);
for(int i = 0; i < e;i++)
{
if(re[i] == max) printf("%s\n",str[i]+1);
}
printf("\n");
}
return 0;
}
本文介绍了一种算法,用于统计每行文本中与关键词完全匹配的数量。算法通过判断字符串是否完全匹配来实现,适用于数据量较小的情况。代码示例展示了如何遍历文本和关键词集合,进行匹配计数。

1405

被折叠的 条评论
为什么被折叠?



