博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hiho #1485 : hiho字符串(滑动窗口)
阅读量:5275 次
发布时间:2019-06-14

本文共 3156 字,大约阅读时间需要 10 分钟。

#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[256];int ans = 100005;int main(){    string s;    while (cin >> s)    {        memset(c, 0, sizeof(c));        int l = s.length();        for (int i = 0,j=0; i < l; i++)        {            while (j < l && (c['h'] < 2 || c['i'] < 1 || c['o'] < 1))            {                c[s[j]]++;                j++;                if (c['h'] > 2 || c['i'] > 1 || c['o'] > 1)                    break;            }                        if (c['h'] == 2 && c['i'] == 1 && c['o'] == 1)            {                ans = min(ans, j - i);            }            c[s[i]]--;        }        if (ans == 100005)            ans = -1;        cout << ans << endl;    }}

 

 

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

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".

 

代码:

1 #include "iostream" 2 #include "string" 3 #include "string.h" 4 using namespace std; 5  6 string str; 7 int ans = 100005; 8  9 int count1[256];10 int count2[256];11 12 string minWindow(string S, string T) {13     if (T.size() == 0 || S.size() == 0)14         return "";15 16     memset(count1, 0, sizeof(count1));17     memset(count2, 0, sizeof(count2));18 19     for (int i = 0; i < T.size(); i++)20     {21         count1[T[i]]++;22         count2[T[i]]++;23     }24 25     int count = T.size();26 27     int start = 0;28     int minSize = 100005;29     int minStart;30     for (int end = 0; end < S.size(); end++)31     {32         if (count2[S[end]] > 0)33         {34             count1[S[end]]--;35             if (count1[S[end]] >= 0)36                 count--;37         }38         if (count == 0)39         {40             while (true)41             {42                 if (count2[S[start]] > 0)43                 {44                     if (count1[S[start]] < 0)45                         count1[S[start]]++;46                     else47                         break;48                 }49                 start++;50             }51 52             if (minSize > end - start + 1)53             {54                 minSize = end - start + 1;55                 minStart = start;56             }57         }58     }59 60     if (minSize == ans)61         return "";62 63     string ret(S, minStart, minSize);//string 构造函数64     return ret;65 }66 67 int main()68 {69     while (cin >> str)70     {71         int l = minWindow(str, "hiho").length();72         if (l<4)73             cout << -1 << endl;74         else75             cout << l << endl;76     }77 }
View Code

 

转载于:https://www.cnblogs.com/SeekHit/p/6623843.html

你可能感兴趣的文章
实训第五天
查看>>
平台维护流程
查看>>
2012暑期川西旅游之总结
查看>>
12010 解密QQ号(队列)
查看>>
2014年辛星完全解读Javascript第一节
查看>>
装配SpringBean(一)--依赖注入
查看>>
java选择文件时提供图像缩略图[转]
查看>>
方维分享系统二次开发, 给评论、主题、回复、活动 加审核的功能
查看>>
Matlab parfor-loop并行运算
查看>>
string与stringbuilder的区别
查看>>
2012-01-12 16:01 hibernate注解以及简单实例
查看>>
iOS8统一的系统提示控件——UIAlertController
查看>>
PAT甲级——1101 Quick Sort (快速排序)
查看>>
python创建进程的两种方式
查看>>
1.2 基础知识——关于猪皮(GP,Generic Practice)
查看>>
迭代器Iterator
查看>>
java易错题----静态方法的调用
查看>>
php建立MySQL数据表
查看>>
最简单的线程同步的例子
查看>>
旅途上看的电影和观后感
查看>>