#1485 : 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

思路:

在给定的字符串S中找到最小的窗口使其完全包含hiho。不能多也不能少,

时间复杂度:O(l1+4)(l1为字符串S的长度)

空间复杂度:O(4)

AC代码:

#include "iostream"
#include "string"
#include "string.h"
#include "vector"
#include "map"
#include "algorithm" using namespace std; char c[];
int ans = ; int main()
{
string s;
while (cin >> s)
{
memset(c, , sizeof(c));
int l = s.length();
for (int i = ,j=; i < l; i++)
{
while (j < l && (c['h'] < || c['i'] < || c['o'] < ))
{
c[s[j]]++;
j++;
if (c['h'] > || c['i'] > || c['o'] > )
break;
} if (c['h'] == && c['i'] == && c['o'] == )
{
ans = min(ans, j - i);
}
c[s[i]]--;
}
if (ans == )
ans = -;
cout << ans << endl;
}
}

附上LeetCode上一题类似的滑动窗口问题

76. Minimum Window Substring

Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).

For example,
S = "ADOBECODEBANC"
T = "ABC"

Minimum window is "BANC".

代码:

 #include "iostream"
#include "string"
#include "string.h"
using namespace std; string str;
int ans = ; int count1[];
int count2[]; string minWindow(string S, string T) {
if (T.size() == || S.size() == )
return ""; memset(count1, , sizeof(count1));
memset(count2, , sizeof(count2)); for (int i = ; i < T.size(); i++)
{
count1[T[i]]++;
count2[T[i]]++;
} int count = T.size(); int start = ;
int minSize = ;
int minStart;
for (int end = ; end < S.size(); end++)
{
if (count2[S[end]] > )
{
count1[S[end]]--;
if (count1[S[end]] >= )
count--;
}
if (count == )
{
while (true)
{
if (count2[S[start]] > )
{
if (count1[S[start]] < )
count1[S[start]]++;
else
break;
}
start++;
} if (minSize > end - start + )
{
minSize = end - start + ;
minStart = start;
}
}
} if (minSize == ans)
return ""; string ret(S, minStart, minSize);//string 构造函数
return ret;
} int main()
{
while (cin >> str)
{
int l = minWindow(str, "hiho").length();
if (l<)
cout << - << endl;
else
cout << l << endl;
}
}

hiho #1485 : hiho字符串(滑动窗口)的更多相关文章

  1. [LeetCode]438. 找到字符串中所有字母异位词、76. 最小覆盖子串(滑动窗口解决子串问题系列)

    题目438. 找到字符串中所有字母异位词 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 说明: 字母异位词指字母相同,但排列不同的字符 ...

  2. CodeForces 701C They Are Everywhere (滑动窗口)

    题目链接:http://codeforces.com/problemset/problem/701/C 题意:找到字符串中能包含所有元素的最短字符串长度. 利用“滑动窗口”解题 解题思路: 1. 遍历 ...

  3. LeetCode编程训练 - 滑动窗口(Sliding Window)

    滑动窗口基础 滑动窗口常用来解决求字符串子串问题,借助map和计数器,其能在O(n)时间复杂度求子串问题.滑动窗口和双指针(Two pointers)有些类似,可以理解为往同一个方向走的双指针.常用滑 ...

  4. 基于滑动窗口协议写的程序(UDP实现) .

    正好有一个大作业关于用socket实现滑动窗口协议,所以写了一个,模拟接收方与发送方窗口都是2,用两个线程实现. 下面是代码,注释的比较详细了. socket_udp.h #include<st ...

  5. Hystrix核心基础 - 滑动窗口创建过程及demo

    前言 RxJava可能有些小伙伴没有听过是什么东西,可能是因为大家平时在做业务需求的时候对异步编程了解得比较少,而RxJava就是这么一个响应式编程框架,RxJava在安卓上面用得非常多,做安卓的朋友 ...

  6. leetcode的Hot100系列--3. 无重复字符的最长子串--滑动窗口

    可以先想下这两个问题: 1.怎样使用滑动窗口? 2.如何快速的解决字符查重问题? 滑动窗口 可以想象一下有两个指针,一个叫begin,一个叫now 这两个指针就指定了当前正在比较无重复的字符串,当再往 ...

  7. 算法与数据结构基础 - 滑动窗口(Sliding Window)

    滑动窗口基础 滑动窗口常用来解决求字符串子串问题,借助map和计数器,其能在O(n)时间复杂度求子串问题.滑动窗口和双指针(Two pointers)有些类似,可以理解为往同一个方向走的双指针.常用滑 ...

  8. 【LeetCode】无重复字符的最长子串【滑动窗口法】

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...

  9. Flink 滑动窗口使用触发器会触发多个窗口的计算

    之前有小伙伴在群里说:滑动窗口使用触发器让每条数据都触发一次计算 但是他并没有得到预期的结果:每条数据都触发一次计算,输出一条结果,而是每天数据都输出了很多条结果 为什么会这样呢? 写了个小案例,来解 ...

随机推荐

  1. 【Linux开发】linux设备驱动归纳总结(三):6.poll和sellct

    linux设备驱动归纳总结(三):6.poll和sellct xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  2. Flume入门案例

    首先需要通过一个配置文件来配置Agent. 通过flume提供的工具启动agent就可以工作了.   (1)编写配置文件 #example.conf:单节点Flume配置 #命名Agent a1的组件 ...

  3. WebMvcConfigurationSupport与WebMvcConfigurer的关系

    大家从网上及源码注释上查到的解释是,在spring中配置WebMvc时有两种方法,一种是继承WebMvcConfigurationSupport,重写里面相应的方法,还有一种是继承WebMvcConf ...

  4. SQL的DDL和DML

    DDL:数据定义语言,定义库.表结构用的DML:数据操作语言,增.删.改.查DCL:数据控制语言,权限.事务等控制语句 (一)DDL1.操作数据库的语句(1)查看当前DBMS中的所有数据库show d ...

  5. [python] 执行 dos 命令

    python的os模块 os模块调用CMD命令有两种方式:os.popen(),os.system(). 都是用当前进程来调用. os.system是无法获取返回值的.当运行结束后接着往下面执行程序. ...

  6. MySql在win10上的安装(压缩版)

    一.下载: 二.下载zip版,免安装版的. 三.解压缩后,注意:文件夹名称不能包含[空格] C:\MySQL 四.增加环境变量 五.手动在安装目录  C:\MySQL 下新建一个my.ini写入以下内 ...

  7. 升级降级(期望DP)2019 Multi-University Training Contest 7 hdu杭电多校第7场(Kejin Player)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意: 有 1~n 个等级,你现在是1级,求升到n级的花费期望.会给你n个条件(i~i+1级升级 ...

  8. JavaScript刷新事件

    1, Location reload() 方法 2,

  9. Codeforces 1201C. Maximum Median

    传送门 看到中位数考虑先把数排序一下 然后有个显然的贪心,一个数增加后一定不能比下一个数大,不然我们直接增加下一个数显然更优 所以初始时的中位数操作后也是中位数 那么我们只要考虑中间再往后怎么加使得答 ...

  10. Java排序--排序算法(内排序)

    常用内排序算法 我们通常所说的排序算法往往指的是内部排序算法,即需要排序的数据在计算机内存中完成整个排序的过程,当数据率超大或排序较为繁琐时常借助于计算机的硬盘对大数据进行排序工作,称之为外部排序算法 ...