好题。字符串。线性时间。

我认为第一次拿到这个题的人应该不会知道该怎么做吧,要么就是我太弱了。。先搞清楚这个题要求的是什么。从一个长字符串中找一个字串,这个字串中的字符全然包括了另一个给定目标串中的字符,且这个字串的长度要求最小。

另一个很重要的简化,题干指明了要求这样的最短字串仅仅有一个,这个限制事实上暗示了这道题的总体思路。仅仅要找到一个长串,然后缩减到不能缩减就可以。

从题目的要求出发能够发现,这道题对于字符串中字符的顺序是没有要求的。因此能够非常自然的想到用hash表来保存目标串中的每一个字符的个数,然后在源字符串中找到一个字串。包括的字符个数大于等于目标串中的就可以。难就难在怎么实现这个功能。

能够把目标串中每一个字符的个数作为它的需求。每当在长字符串中找到了一个字符,这个字符在目标串中存在。那么需求应该降低1。当需求等于0的时候,表示到眼下为止。长字符串中的字符能够恰好满足目标串中这个字符的需求了。假设一个目标串字符的需求变成了负值,说明在当前长度下,在长字符串中对这个字符的供应过剩了。为了描写叙述简便,我定义当长字符串在目标串对这个字符的需求为正时提供了这个字符,为满足了刚性需求,否者是供应过剩。接下来另一个问题,如何知道目标串被全然满足了呢?你当然能够去逐个的扫描需求是不是都变成非正的了,可是另一个更加简单的方法,那就是把目标串的长度看做是总需求,当满足刚性需求时,总需求减1,当总需求变成0时,说明目标串被满足了。

上面描写叙述的过程在长字符串中找到了一个字串,能够全然满足目标串,但并不保证是最短的,由于非常多字符在其它字符没得到满足时已经供应过剩了,如何把这部分多余的去掉呢?从起点開始往后扫秒长字符串。假设当前字符根本不存在于目标串中,能够直接pass。假设存在于目标串中,且供应过剩了。那么这个字符能够从我们的字串中去掉,相当于我们的字串缩短了。可是要记得把需求量++。由于供应量降低了。知道一个字符,它既存在于目标串中,且他的需求量正好是等于0的,我们就得停下了,由于这时候的所有是刚性需求,不能再降低供应了。

代码例如以下,并没有最优化。只是思路是写出来了。

class Solution {
public:
string minWindow(string S, string T) {
int ct1[270], ct2[270];
int mlen1 = S.length();
int mlen2 = T.length();
memset(ct1, 0, sizeof(ct1));
memset(ct2, 0, sizeof(ct2));
int hole = mlen2, minSize = INT_MAX, start = 0, minstart;
for(int i=0;i<mlen2;i++){
ct1[T[i]]++;
ct2[T[i]]++;
}
for(int i=0;i<mlen1;i++){
if(ct2[S[i]]>0){
ct1[S[i]]--;
if(ct1[S[i]]>=0)
hole--;
}
if(hole == 0){
while(start<mlen1){
if(ct2[S[start]]>0){
if(ct1[S[start]]<0)
ct1[S[start]]++;
else
break;
}
start++;
}
if(minSize>i-start+1){
minSize = i-start+1;
minstart = start;
}
}
}
if(minSize == INT_MAX)
return "";
return S.substr(minstart, minSize);
}
};

leetcode第一刷_Minimum Window Substring的更多相关文章

  1. leetcode第一刷_Minimum Path Sum

    能够用递归简洁的写出,可是会超时. dp嘛.这个问题须要从后往前算,最右下角的小规模是已知的,边界也非常明显,是最后一行和最后一列,行走方向的限制决定了这些位置的走法是唯一的,能够先算出来.然后不断的 ...

  2. leetcode第一刷_Minimum Depth of Binary Tree

    非常easy的题目.只是还是认为要说一下. 最小深度.非常快想到bfs,层序遍历嘛.本科的时候实在是没写过多少代码,一開始竟然想不到怎么保存一层的信息.后来想到能够压入一个特殊的对象,每次到达这个对象 ...

  3. LeetCode解题报告—— Minimum Window Substring && Largest Rectangle in Histogram

    1. Minimum Window Substring Given a string S and a string T, find the minimum window in S which will ...

  4. 【LeetCode】76. Minimum Window Substring

    Minimum Window Substring Given a string S and a string T, find the minimum window in S which will co ...

  5. 【一天一道LeetCode】#76. Minimum Window Substring

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  6. 【LeetCode】76. Minimum Window Substring 最小覆盖子串(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 滑动窗口 日期 题目地址: https://leet ...

  7. 【LeetCode练习题】Minimum Window Substring

    找出包含子串的最小窗口 Given a string S and a string T, find the minimum window in S which will contain all the ...

  8. leetcode第一刷_Set Matrix Zeroes

    这个题乍一看非常easy,实际上还挺有技巧的.我最開始的想法是找一个特殊值标记.遇到一个0,把他所相应的行列中非零的元素标记成这个特殊值.0值保持不变,然后再从头遍历一次,碰到特殊值就转化成0. 问题 ...

  9. leetcode第一刷_Permutations II

    当有反复元素的时候呢? 不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉.可是,在这道题上这个通用方法竟然超时了! 怎么办? ...

随机推荐

  1. 3最短路的几种解法 ------例题< 最短路 >

    点击进入例题   最短路 我知道的有三种方法 1 : 深搜 每次  每次有更小的路径时  就更新   ,   2 :   Dijkstra    3 : floyd 前两种   是  单源 最短路径 ...

  2. Java常用集合类

    上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,Abstract ...

  3. 为什么选择Sqoop?(三)

    为什么选择 Sqoop? 通常基于三个方面的考虑: 1.它可以高效.可控地利用资源,可以通过调整任务数来控制任务的并发度.另外它还可以配置数据库的访问时间等等. 2.它可以自动的完成数据类型映射与转换 ...

  4. Windows键盘驱动结构与消息机制--转

    https://www.douban.com/note/318793892/ 本文主要介绍按键消息是如何传递到窗口并转化为具体的按键消息的. Windows系统是事件驱动的多任务系统,其中按键和鼠标是 ...

  5. 查看/进入mac根目录的方式

    1.通过“前往文件夹”快捷键组合 (1)打开finder,点击上部菜单栏“前往”,然后“个人”,直接跳转. (2)快捷键组合:command + shift + G:注意:打开finder后,再快捷键 ...

  6. 【译】x86程序员手册00 - 翻译起因

    从上一次学习MIT的操作系统课程又过去了一年.上次学习并没有坚持下去.想来虽有种种原因,其还在自身无法坚持罢了.故此次再鼓起勇气重新学习,发现课程都已由2014改版为2016了.但大部分内容并没有改变 ...

  7. 查看Windows XP是否已激活的方法

    打开开始→运行, 在输入:oobe/msoobe /a,回车后系统会弹出窗口告诉你系统是否已经激活

  8. POJ 3070 - 快速矩阵幂求斐波纳契数列

    这题并不复杂. 设$A=\begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix}$ 由题中公式: $\begin{pmatrix}f(n+1) & ...

  9. Ubuntu无线转有线教程

    本来想测试一下有线转无线的,奈何网卡不支持,所以就测试了一回无线转有线的测试!(真无聊,不过也算学习一下linux网桥的知识) ca0gu0@ub:~$ sudo brctl addbr br0 #添 ...

  10. HDU_1158_Employment Planning_dp

    Employment Planning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...