题目大意:
就是给你一些关键词和一些句子,然后在分别在每个句子中寻找关键词,输出关键词最多的句子,关键词数量相同的句子,都要输出。
字符串的输入,在给定的句子中提取一个单词存取到cmp[100]数组中,将提取的单词与关键词调用strcmp函数比较,最后确定下一次偏移量接着提取单词进行比较。
using namespace std;
char keyword[20][20];
//存放关键词
char excuse[20][100];
//存放理由
int len[20];
//每个理由中关键词的总数
char cmp[100];
//存放句子中提取的单词
int kNum,eNum;
//关键词的个数和理由的个数
int main ()
{
inti;
chartempExcuse[100];
//保护源串
int
num;
//保存理由中关键词的个数
intmaxnum;
intcas=0;
//测试用例数目
while(cin>>kNum>>eNum)
{
cas++;
maxnum=-1;
for(i=1;i<=kNum;i++)
//输入关键词
cin>>keyword[i];
cin.get();
//除去cin后面的换行
memset(len,0,sizeof(len));
//初始化len
for(i=1;i<=eNum;i++)
{
cin.getline(excuse[i],100,'\n');
//输入理由
strcpy(tempExcuse,excuse[i]);
changeFormat(tempExcuse);
len[i]=countKeyword(tempExcuse);
}
for(i=1;i<=eNum;i++)
//一个打擂台,找出关键字最多的个数
{
if(len[i]>maxnum)
maxnum=len[i];
}
cout<<"Excuse Set#"<<cas<<endl;
//没有处理所有理由中没有关键词的情况
for(i=1;i<=eNum;i++)
{
if(len[i]==maxnum)
cout<<excuse[i]<<endl;
}
cout<<endl;
}
return0;
}
void changeFormat(char *str)
//转换为小写函数
{
intlen=strlen(str);
inti;
for(i=0;i<len;i++)
{
if(str[i]>='A'&&str[i]<='Z')
str[i]=str[i]+32;
}
}
int countKeyword(char *str)
{
intlen,i,j,k,kwordLen;
len=strlen(str);
int num=0;
for(k=1;k<=kNum;k++)
//关键词的循环,每个关键词都在理由中找一遍
{
kwordLen=strlen(keyword[k]);
//关键词串的长度
for(i=0;i<=len-kwordLen;i++)
//(单独弄个变量而不是在i<=len-strlen[keyword[k],因为调试的时
//候总有异常)
{
if(isAlphabet(str[i]))
{
for(j=0;isAlphabet(str[i+j]);j++)
cmp[j]=str[i+j];
cmp[j]='\0';
if(strcmp(cmp,keyword[k])==0)
num++;
i=i+j-1;
//偏移量重新定位
}
}
}
}
if(t>='a'&& t<='z')
return true;
else
return false;
题目分析:
题目代码:
#include <iostream>
#include <cstring>
void changeFormat(char *str);
//将理由全部转换为小写
int countKeyword(char *str);
//统计一个理由中含有的关键词数
bool isAlphabet(char t);
//判断是否为字符
return num;
bool isAlphabet(char t)
//判断是否为字符
{
}