poj1598 Excuses,Excuses!

题目大意:
    就是给你一些关键词和一些句子,然后在分别在每个句子中寻找关键词,输出关键词最多的句子,关键词数量相同的句子,都要输出。

题目分析:
    字符串的输入,在给定的句子中提取一个单词存取到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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值