T - hiho字符串 HihoCoder - 1485 (..map的使用把)

T - hiho字符串 HihoCoder - 1485 (map)

如果一个字符串恰好包含2个'h'、1个'i'和1个'o',我们就称这个字符串是hiho字符串。  

例如"oihateher"、"hugeinputhugeoutput"都是hiho字符串。

现在给定一个只包含小写字母的字符串S,小Hi想知道S的所有子串中,最短的hiho字符串是哪个。

Input

字符串S  

对于80%的数据,S的长度不超过1000  

对于100%的数据,S的长度不超过100000

Output

找到S的所有子串中,最短的hiho字符串是哪个,输出该子串的长度。如果S的子串中没有hiho字符串,输出-1。

Sample Input
happyhahaiohell
Sample Output
5
发现自己不好的习惯,看到这题以为自己不会做就不做了 隔了好久拖了很久才开始敲得改
这题就是要hiho这个  先把有hio的字符都存在结构里  然后遍历四个  这个时候用map优化下 不用四个四个的看    直接取前四个然后去掉第一个加上后一个这样子下去就好了  时间是4ms
 
 
 
 
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
struct node
{
	int pos;
	char ch;
}t[100005];
char str[100005];
int main()
{
	gets(str);
	int k=0;
	int len=strlen(str);
	for(int i=0;i<len;i++)
	{
		if(str[i]=='h'||str[i]=='o'||str[i]=='i')
		{
			k++;
			t[k].ch=str[i];
			t[k].pos=i;
		}
	}
	int h1=0,h2=0,o=0,i=0;
	int flag=0;
	int ans=0x3f3f3f3f;
	if(k<4)printf("-1\n");
    map<char,int>mp;
    for(int i=1;i<=4;i++)
	mp[t[i].ch]++;
	
	if(mp['h']==2&&mp['i']==1&&mp['o']==1)
	ans=t[4].pos-t[1].pos+1;
	
	int head=1;
	for(int i=5;i<=k;i++)
	{
		mp[t[head].ch]--;
		mp[t[i].ch]++;
		head++;	
		if(mp['h']==2&&mp['i']==1&&mp['o']==1)
		ans=min(ans,t[i].pos-t[head].pos+1);
	} 
	if(ans!=0x3f3f3f3f)printf("%d\n",ans);
	else printf("-1\n");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值