[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 }
时间: 2024-10-09 01:54:32

[Offer收割]编程练习赛11 题目1 : hiho字符串的相关文章

[Offer收割]编程练习赛11 题目2 : 物品价值

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi现在有n个物品,每个物品都有一个价值.并且这n个物品总共有m个不同的属性,每个物品都具有其中若干属性. 小Ho要从中选出若干物品,满足每个属性都正好有奇数个物品拥有,且被选出的物品价值总和最大.你能帮助小Ho完成任务么? 输入 第一行一个数T(<=10),表示数据组数.对于每一组数据: 第一行两个数n,m(1<=n<=1000,m<=10) 接下来每两行描述一件物品.对于每一件物品: 第一行两个数v

[Offer收割]编程练习赛11 题目3 : 岛屿3

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H国正在进行一项持续N周的填海造岛工程.整片工程海域可以被看作是1000x1000的网格. 每周都有一块1x1的单位方格海域被填成陆地.如果我们将连成一片的陆地(一块单位方格与它上下左右4个单位方格是相连的)视为岛屿,H国想监测每周末整片海域中一共存在有多少个岛屿,以及这些岛屿的总面积和总周长各是多少. 假设工程持续三周,第一周被填的海域坐标是(0, 0),那么第一周结束后有1座岛屿.总面积是1.总周长是4: #..

[Offer收割]编程练习赛11 题目4 : 排队接水

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 有n个小朋友需要接水,其中第i个小朋友接水需要ai分钟. 由于水龙头有限,小Hi需要知道如果为第l个到第r个小朋友分配一个水龙头,如何安排他们的接水顺序才能使得他们等待加接水的时间总和最小. 小Hi总共会有m次询问,你能帮助他解决这个问题吗? 假设3个小朋友接水的时间分别是2,3,4.如果他们依次接水,第一位小朋友等待加接水的时间是2,第二位小朋友是5,第三位小朋友是9.时间总和是16. 输入 第一行一个数T(T<=1

hihocoder offer收割编程练习赛11 A hiho字符串

思路: 我用的尺取. 注意题目描述为恰好2个'h',1个'i',1个'o'. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <algorithm> 5 using namespace std; 6 7 const int INF = 0x3f3f3f3f; 8 9 int ch[100005], ci[100005], co[100005]; 10 1

[Offer收割]编程练习赛12 题目4 : 寻找最大值

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大.其中AND是按位与操作. 小Ho当然知道怎么做.现在他想把这个问题交给你. 输入 第一行一个数T,表示数据组数.(1 <= T <= 10) 对于每一组数据: 第一行一个整数N(1<=N<=100,000) 第二行N个整数A1, A2, A3, ... AN

[Offer收割]编程练习赛12 题目1 : 歌德巴赫猜想

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 哥德巴赫猜想认为"每一个大于2的偶数,都能表示成两个质数之和". 给定一个大于2的偶数N,你能找到两个质数P和Q满足P<=Q并且P+Q=N吗? 输入 一个偶数N(4 <= N <= 1000000) 输出 输出P和Q.如果有多组解,输出P最小的一组. 样例输入 10 样例输出 3 7 思路 判断和为N两个数是否为素数 代码 1 import java.util.Scanner; 2 3 pu

[Offer收割]编程练习赛12 题目2 : 一面砖墙

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi的学校的教学楼前有一面砖墙.这面墙由N层砖砌成,其中从上到下第i层包含Ci块高度相同但宽度不同的砖. 例如下图所示的这面墙,由3层砖砌成.其中第1层包含3块砖,从左到右宽度依次是6.4和3:第2层包含4块砖,从左到右依次宽度依次是4.4.2和3:第3层包含3块砖,从左到右宽度依次是5.6和2. +------------+ | 6 | 4 |3 | +------------+ | 4 | 4 |2|3 | +-

[Offer收割]编程练习赛12 题目3 : 矩形分割

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一块由NxM个单位正方形组成的矩形.现在小Ho在某些单位正方形上画了一道分割线,这条分割线或者是单位正方形的主对角线(用'\'表示),或者是副对角线(用'/'表示). 现在小Hi想知道这些分割线把NxM的矩形分割成了多少块区域. 例如 /\/ 就把2x2的矩形分成了5个区域. /\/\ / \/ 把3x4的矩形分成了7个区域. 输入 第一包含两个整数N和M.(1 <= N, M <= 100) 以下N行每行包

hihocoder offer收割编程练习赛11 B 物品价值

思路: 状态压缩 + dp. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int INF = 0x3f3f3f3f; 8 9 int t, n, m, s; 10 int V[1005], S[1005], dp[1005][(1 << 11) +