【信息学奥赛】1143:最长最短单词

上一题由于是空格间隔,故我们可以使用scanf来分割字符串,并一一求解字符串长度。

但是该题是要求最长单词和最短单词,而且是第一次出现的最长和最短单词,所以我们应该整个字符串读入,然后根据分隔符来分割单词,并更新记录最长长度和最短长度,以及对应的下标,然后后续根据下标和长度来输出。

#include<iostream>
#include<cstring>
#include<climits>
using namespace std;

char a[20001];

int main()
{
   fgets(a,20001,stdin);
   int len=strlen(a);
   int sum=0,maxl=INT_MIN,minl=INT_MAX,maxp=0,minp=0;
   for(int i=0;i<len;i++)
   {
	   if(a[i]!=' '&&a[i]!=',') //不是分隔符则长度加一
		   sum++;
	   else if(sum>0) //是分隔符并且前面长度大于0
	   {
		   if(sum>maxl) //大于当前最长
		   {
			   maxl=sum;
			   maxp=i-sum;
		   }
		   else if(sum<minl) //小于当前最短
		   {
			   minl=sum;
			   minp=i-sum;
		   }
		   sum=0; //长度清零
	   }   
   }
   for(int i=maxp;i<=maxp+maxl-1;i++)
	   cout<<a[i];
   cout<<endl;
   for(int i=minp;i<=minp+minl-1;i++)
	   cout<<a[i];
   cout<<endl;
   return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值