[Offer收割]编程练习赛11 题目1 : hiho字符串
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
如果一个字符串恰好包含2个'h'、1个'i'和1个'o',我们就称这个字符串是hiho字符串。
例如"oihateher"、"hugeinputhugeoutput"都是hiho字符串。
现在给定一个只包含小写字母的字符串S,小Hi想知道S的所有子串中,最短的hiho字符串是哪个。
输入
字符串S
对于80%的数据,S的长度不超过1000
对于100%的数据,S的长度不超过100000
输出
找到S的所有子串中,最短的hiho字符串是哪个,输出该子串的长度。如果S的子串中没有hiho字符串,输出-1。
- 样例输入
-
happyhahaiohell
- 样例输出
-
5
思路
维护一个h、i、o出现次数分别不低于2、1、1的滑动窗口,收敛窗口左边界,记录满足条件窗口的最小宽度。
代码
1 import java.util.HashMap; 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static boolean match(int[] cnt) { 7 return cnt['h' - 'a'] == 2 && cnt['i' - 'a'] == 1 && cnt['o' - 'a'] == 1; 8 } 9 10 public static int resolve(String s) { 11 int[] cnt = new int[26]; 12 int min = Integer.MAX_VALUE; 13 for (int l = 0, r = 0; l < s.length(); l++) { 14 while (r < s.length() && (cnt['h' - 'a'] < 2 || cnt['i' - 'a'] < 1 || cnt['o' - 'a'] < 1)) { 15 cnt[s.charAt(r) - 'a']++; 16 r++; 17 } 18 19 if (match(cnt)) { 20 min = Math.min(min, r - l); 21 } 22 cnt[s.charAt(l) - 'a']--; 23 } 24 25 return min == Integer.MAX_VALUE ? -1 : min; 26 } 27 28 public static void main(String[] args) { 29 Scanner sc = new Scanner(System.in); 30 String s = sc.nextLine(); 31 System.out.println(resolve(s)); 32 } 33 }