poj1598 Excuses,Excuses!

本文介绍了一个简单的字符串处理程序,该程序能够从一组给定的理由中找出包含最多指定关键词的理由。通过使用C++实现,文章详细解释了如何进行字符串比较、计数及格式调整等关键步骤。
题目大意:
   就是给你一些关键词和一些句子,然后在分别在每个句子中寻找关键词,输出关键词最多的句子,关键词数量相同的句子,都要输出。

题目分析:
   字符串的输入,在给定的句子中提取一个单词存取到cmp[100]数组中,将提取的单词与关键词调用strcmp函数比较,最后确定下一次偏移量接着提取单词进行比较。

题目代码:
#include <iostream>
#include <cstring>
 using namespace std;
 char keyword[20][20];     //存放关键词
 char excuse[20][100];     //存放理由
 int len[20];            //每个理由中关键词的总数
 char cmp[100];           //存放句子中提取的单词

 int kNum,eNum;           //关键词的个数和理由的个数

void changeFormat(char *str);    //将理由全部转换为小写
int countKeyword(char *str);      //统计一个理由中含有的关键词数
bool isAlphabet(char t);         //判断是否为字符



 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;   //偏移量重新定位

            }


         }


   }

return num;

 }

bool isAlphabet(char t)  //判断是否为字符
{
    if(t>='a'&& t<='z')
    return true;

    else
    return false;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值