T-hiho字符串

来源:互联网 发布:python assert() 编辑:程序博客网 时间:2024/06/11 23:31

如果一个字符串恰好包含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
import java.util.*;public class Main {   static Scanner in = new Scanner(System.in);   static boolean com(int[] a){   return a['h'-'a']==2&&a['i'-'a']==1&&a['o'-'a']==1;   }    public static void main(String[] args) {        while (in.hasNext()) {         String s=in.next();         int min=Integer.MAX_VALUE;         int[] cnt=new int[26];       for (int i = 0,j=0; i < s.length(); i++) {     while(j<s.length()&&(cnt['h'-'a']<2||cnt['i'-'a']<1||cnt['o'-'a']<1)){     cnt[s.charAt(j)-'a']++;//统计每个字符出现次数长度     j++;     } 

       if(com(cnt)){//如果恰好都出现,统计长度        min=Math.min(min, j-i);//j正好是当前统计字符的下一位,做差正好是长度,不然会是j-i+1        }         cnt[s.charAt(i)-'a']--;//从前面开始不断缩小最小的长度,有可能一个字符出现多次       }       if(min==Integer.MAX_VALUE)          System.out.println(-1);         else      System.out.println(min);       }    }}

思路

创造一个h、i、o出现次数分别不低于2、1、1的滑动窗口,收敛窗口左边界,记录满足条件窗口的最小宽度。实在不明白自己手写过程即可,这个思路还是十分巧妙的

原创粉丝点击