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
找到S的所有子串中,最短的hiho字符串是哪个,输出该子串的长度。如果S的子串中没有hiho字符串,输出-1。
happyhahaiohell
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; }