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

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

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

从题目的要求出发能够发现,这道题对于字符串中字符的顺序是没有要求的。因此能够非常自然的想到用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. BZOJ 4811 树链剖分+线段树

    思路: 感觉这题也可神了.. (还是我太弱) 首先发现每一位不会互相影响,可以把每一位分开考虑,然后用树链剖分或者LCT维护这个树 修改直接修改,询问的时候算出来每一位填0,1经过这条链的变换之后得到 ...

  2. ACM_出题人这样不好吧

    出题人这样不好吧 Time Limit: 2000/1000ms (Java/Others) Problem Description: 作为编协的第一次月赛,肯定是要有防AK(ALL KILL)的题目 ...

  3. Java中的overload(方法的覆写)

    方法覆写(overload)与方法的重载非常相似,它在 Java的继承中也有很重要的应用. 写程序可能会碰到下面的情况,在父类中已经实现的方法可能不够精确,不能满足子类 的需求.例如在前面的 Anim ...

  4. CSS——层级

    层级问题:选中的盒子显示的效果并不完整,右边的边框并没有显示红色,原因是其右边的盒子压了它的边框. <!DOCTYPE html> <html lang="en" ...

  5. SQL基本操作——COVERT

    CONVERT() 函数是把日期转换为新数据类型的通用函数.CONVERT() 函数可以用不同的格式显示日期/时间数据. --语法 CONVERT(data_type(length),data_to_ ...

  6. Java编译器、JVM、解释器

    Java虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行.本文首先简要介绍从Java文件的编译 ...

  7. Caffe2:python -m caffe2.python.operator_test.relu_op_test

    1. 进行语句测试时候,出现问题, 设置环境变量CUDA_VISIBLE_DEVICES 参考: cuda设置指定可见方法 在/etc/profile文件或者-/.bashrc末尾添加以下行: exp ...

  8. ProE常用曲线方程:Python Matplotlib 版本代码(蝴蝶曲线)

    花纹的生成可以使用贴图的方式,同样也可以使用方程,本文列出了几种常用曲线的方程式,以取代贴图方式完成特定花纹的生成. 注意极坐标的使用................. 前面部分基础资料,参考:Pyt ...

  9. getdlgitemtext

    获取控件内信息 set 设置控件内信息 oninitdialog初始化控件时的操作

  10. mysql5.7初始化密码报错ERROR1820(HY000):YoumustresetyourpasswordusingALTERUSERstateme

    1,mysql5.6是密码为空直接进入数据库的,但是mysql5.7就需要初始密码 cat /var/log/mysqld.log | grep password 或者:grep 'temporary ...