一道字符串处理的题目,要求对给出的单词找到给出句子中匹配最多的句子。
核心是单词的匹配,思路也很直接,把每个单词但单独提取出来匹配。
题目不难,但是有挺多值得注意的编程细节。
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
char key[21][21], excuses[21][71], cs[21][71];//cs存放转换为小写的字符串
char lower[71];
int levels[21];//存放每个借口的匹配度
int K, E;
int level(int);
int main()
{
freopen("data.txt", "r", stdin);
int count = 1;
while (scanf("%d%d", &K, &E) == 2)//@
{
printf("Excuse Set #%d\n", count++);
int i, j, m = 0;
for (i = 0; i < K; i++)
scanf("%s", key[i]);
getchar();//注意:这里要用getchar把"\n"去掉,不然会使第二个测试无法进行,会影响到@那个地方的输入
for (i = 0; i < E; i++)
cin.getline(excuses[i], 71);//之前用fgets导致它包含了"\n",所以换成这个
for (i = 0; i < E; i++)//预处理成小写形式的
for(j = 0; j < 71; j++)
if (isalpha(excuses[i][j]))
cs[i][j] = tolower(excuses[i][j]);
else
cs[i][j] = excuses[i][j];
for (i = 0; i < E; i++)
levels[i] = level(i);//
m = levels[0];
for (i = 1; i < E; i++)
if(levels[i] > m)
m = levels[i];
for(i = 0; i < E; i++)
if(levels[i] == m)
printf("%s\n", excuses[i]);
printf("\n");
}
}
int level(int a)
{
int count = 0, k = 0;
char s[100];
for (int i = 0; cs[a][i] != '\0'; i++)//把每个单词提取出来一一比较
{
if (isalpha(cs[a][i]))
s[k++] = cs[a][i];
else
{
s[k] = '\0';
for (int n = 0; n < K; n++)
if(strcmp(s, key[n]) == 0)
count++;
k = 0;
}
}
return count;
}