滑动窗口(最小覆盖子串)

题目描述:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。

示例

输入: S = "ADOBECODEBANC", T = "ABC"

输出: "BANC"

分析

明显是要使用滑动窗口,比较复杂的一点是,滑动窗口的长度是可变的。

所以区别于固定滑动窗口的达到窗口长度后随着右指针向右移动一位左指针也要移动一位

滑动窗口更改长度的原因是在滑动窗口中去掉不需要的字符

举个例子:S=ADOBECODEBANC,T=ABC,首先一直向后走,

此时滑动窗口中为ADOBECODEB,hash数组中hash[A]=0,hash[B]=-1,hash[C]=0,hash[D]=-2,hash[E]=-2,hash[O]=-1,

继续向右走,当我们右指针走到第二个A的时候ss[left]=-1,

就应该把第一个A去掉,同时,要去掉T中没有的:DO,也去掉T中虽然有但我们后面(滑动窗口中)已经有了的:B,之后继续去掉T中不需要的:E,

这时left应该指向C,然后就不继续动了。此时滑动窗口中字符串为CODEBA,right继续向后走

走到N无所谓,走到C时,又要继续挪动我们的滑动窗口,

同理,去掉CODE。于是此时滑动窗口为BANC。

举个另一个的例子,S=DOBECODEBANC,T=ABC,当left指向D,right指向O时,(left指向的也是T中不需要的,所以应该右移左指针),

以代码来看:

hash[D]=-1,因此也要让left右移,直到找到一个滑动窗口中需要的字符或left已经等于right

核心思想:始终让left指向T中需要的字符或者已经指向了right。

代码

class Solution {

    public String minWindow(String s, String t) {

        char[] ss = s.toCharArray();

        char[] tt = t.toCharArray();

        //用来存储滑动窗口中的值(注意还有小写的)

        int[]hash = new int[256];

        //最小子串的长度

        int minlength = s.length();

        //最小子串

        String results = "";

        for(char smallt:tt)

        {

            hash[smallt-'0']++;

        }

        int left = 0;

        int right = 0;

        int count = tt.length;

        for(;right<ss.length;right++)

        {

            hash[ss[right]-'0']--;

            //说明当前的字符存在于T中,且当前滑动窗口中还需要该字符

            //后面这个且的意思就是比如我的T为ABC,我只有第一次遇到A才会count--,而第二次就不会了,

            if(hash[ss[right]-'0']>=0)

            {

                count--;

            }

            //right又遇到了left处的字符(特指遇到T中存在的),或left处的字符不是T中需要的,就右移左指针直到找到需要的或者left=right

            while(left<right&&hash[ss[left]-'0']<0)

            {

                hash[ss[left]-'0']++;

                left++;

            }

            //这里大于等于是防止最小覆盖子串就是s其本身

            if(count==0&&minlength>=right-left+1)

            {

                minlength = right-left+1;

                results = s.substring(left,right+1);

            }

        }

        return results;

    }

}

作者:coder_hezi

链接:https://leetcode-cn.com/problems/minimum-window-substring/solution/hua-dong-chuang-kou-suan-fa-chao-xiang-xi-jie-xi-k/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,028评论 0 2
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,448评论 0 13
  • 字串问题有个通用的滑动窗口算法,时间复杂度O(n2) 其中关键: 窗口大小不固定:构造合适的count来控制窗口的...
    superlj666阅读 713评论 0 0
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,373评论 0 17
  • 我发现了,我是一个假性正能量的人。 我之所以把自己定义为假性正能量是基于如下的事实,当苦难还没有来临之前,我总是认...
    牢笼已占阅读 317评论 0 1