(1)题目
(2)分析
注意:题目要求恰好包含2个h,1个i,1个0。即不能多也不能少
import java.util.Scanner;
public class Main {
/*
* 思路:
* 测试数据:happyhahaiohell
* */
public static void main(String[] args){
//1.输入字符串
Scanner sc = new Scanner(System.in);
char[] w = sc.next().toCharArray();
//2.遍历字符串
int min = Integer.MAX_VALUE;//存放当前仅包含2个h、1个i、1个o的最短子串长度
int j=-1;//子数组的尾坐标
for(int i=0;i<w.length;i++) {
char w1 = w[i];
if(check(w1)) {//该字符合法,找到当前子数组的第一个位置i,接着j向后查找
if(j==-1) {//j的第一次定位
j=i+1;
}
//从j开始循环,找到合适的子数组
while(j<w.length) {
char w2 = w[j];
if(check(w2) && containAll(w, i, j)) {//如果当前字符合法,并且包含所有字符(出现次数一致),则判断当前子数组是否小于当前最小子数组长度
if(checkAll(w, i, j) && j-i+1 < min) {
min = j-i+1;
}
break;//完成一次查找,接着查找下一个合法子数组(注意,只要包含2个h、1个i、1个o,就退出,出现次数超了也要退出)
}
j++;
}//while
}//if
}//for
//3.输出最小的子数组长度
System.out.println(min==Integer.MAX_VALUE?-1:min);
}
//1.判断字符c是不是合法,即是不是h、i或o
private static boolean check(char c) {
return c=='h' || c=='i' || c=='o';
}
//2.判断数组w从下标i到下标j中 是否包含2个h,1个i 和 一个o,不能多也不能少
private static boolean checkAll(char[] w,int i,int j) {
int c1=0,c2=0,c3=0;
for(int k=i;k<=j;k++) {
if(w[k]=='h') c1++;
if(w[k]=='i') c2++;
if(w[k]=='o') c3++;
}
return c1==2 && c2==1 && c3==1;
}
//3.判断数组w从下标i到下标j中 是否包含2个h,1个i 和 一个o,可以超
private static boolean containAll(char[] w,int i,int j) {
int c1=0,c2=0,c3=0;
for(int k=i;k<=j;k++) {
if(w[k]=='h') c1++;
if(w[k]=='i') c2++;
if(w[k]=='o') c3++;
}
return c1>=2 && c2>=1 && c3>=1;
}
}