题目描述

给出两个字符串S和T,要求在O(n)的时间复杂度内在S中找出最短的包含T中所有字符的子串。
例如:
S ="ADOBECODEBANC"
T ="ABC"
找出的最短子串为"BANC".
注意:
如果S中没有包含T中所有字符的子串,返回空字符串 “”;
满足条件的子串可能有很多,但是题目保证满足条件的最短的子串唯一。

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

Note: 
If there is no such window in S that covers all characters in T, return the emtpy string"".

If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.

示例1

输入

复制

"ADOBECODEBANC","ABC"

输出

复制

"BANC"

链接:https://www.nowcoder.com/questionTerminal/c466d480d20c4c7c9d322d12ca7955ac?f=discussion
来源:牛客网

class Solution {
public:
    //维持一个窗口滑动,左边是left,右边是right,然后判断是否包含T
    string minWindow(string S, string T)
    {
        string result;
        if(!S.size() || !T.size())
        {
            return result;
        }
        map<char, int>Tmap;   //存储T字符串里字符,便于与S匹配
        int left = 0;       //左边窗口,起始为0
        int count = 0;      //计数器,对窗口内T串字符数量进行计数,起始为0
        //装载T串
        int minlen = S.size() + 1;      //最小窗口,便于比较最后取最小的,初始化取最大
        for(int i = 0; i < T.size(); ++i)
        {
            Tmap[T[i]]++;
        }
        //移动右边窗口
        for(int right = 0; right < S.size(); ++right)
        {
            if(Tmap.find(S[right]) != Tmap.end())   //当窗口内部有T中的字符
            {
                if(Tmap[S[right]] > 0)
                {
                    count++;            //计数器+1
                }
                Tmap[S[right]]--;   //去掉包含的,剩下都是没包含的
                while(count == T.size())//当窗口内有T的所有字符,就要开始移动左窗口啦
                {
                    if(Tmap.find(S[left]) != Tmap.end())
                    {
                        //好了,这就是一个包含字符串的窗口范围:left ~ right,
                        //判断是否比当前窗口还小,是就取串
                        if(minlen > right - left + 1)
                        {
                            //更新窗口大小
                            minlen = right -left + 1;
                            result = S.substr(left, right - left + 1);
                        }
                        //舍弃窗口左边字符串,继续移动窗口
                        Tmap[S[left]]++;
                        if(Tmap[S[left]] > 0)            //如果左边连续相同,则count不递减,窗口需要继续向右移动
                        {
                            count--;
                        }
                    }
                    left++;             //移动左窗口
                }
            }
        }
        return result;
    }
};


leetcode73:minmum-window-substring的更多相关文章

  1. 53. Minimum Window Substring

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

  2. Minimum Window Substring @LeetCode

    不好做的一道题,发现String Algorithm可以出很多很难的题,特别是多指针,DP,数学推导的题.参考了许多资料: http://leetcode.com/2010/11/finding-mi ...

  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. leetcode76. Minimum Window Substring

    leetcode76. Minimum Window Substring 题意: 给定字符串S和字符串T,找到S中的最小窗口,其中将包含复杂度O(n)中T中的所有字符. 例如, S ="AD ...

  5. 【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 ...

  6. 刷题76. Minimum Window Substring

    一.题目说明 题目76. Minimum Window Substring,求字符串S中最小连续字符串,包括字符串T中的所有字符,复杂度要求是O(n).难度是Hard! 二.我的解答 先说我的思路: ...

  7. [LeetCode] Minimum Window Substring 最小窗口子串

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  8. [Leetcode][JAVA] Minimum Window Substring

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  9. Java for LeetCode 076 Minimum Window Substring

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  10. lintcode 中等题:minimum window substring 最小子串覆盖

    题目 最小子串覆盖 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 样例 给出source = "ADOBECODEBANC ...

随机推荐

  1. 《C++ primer plus》第3章练习题

    注:有的题设条件自己改动了一下,比如英寸英尺改成米和厘米,部分题目自己加了点额外要求. 1.要求用户输入身高(m),用下划线提示用户输入,将身高转化成"米"加"厘米&qu ...

  2. Java (二)基于Eclipse配置Commons IO的环境

    上一篇:Java (一)下载APACHE Commons IO 一.新建一个Java Project 二.使用鼠标右键点击工程,选择New > Folder 三.在Folder name输入文件 ...

  3. P4568 [JLOI2011]飞行路线 / P2939 [USACO09FEB]Revamping Trails G

    题目描述 Link Alice 和 Bob 现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在 \(n\) 个城市设有业务,设这些城市分别标记为 \(0\) 到 \(n-1\),一共 ...

  4. 《To C产品经理进阶》

    我所说的,都是错的. To C产品设计和To B产品设计对一个优秀的产品经理的洞察能力.架构能力有共通的要求. 实际产品设计过程中,To C产品往往是从商业思维思考,侧重用户研究,思考用户心智,由产品 ...

  5. JavaScript倒计时效果

    实现思路: 输入的时间减去现在的时间就是剩余的时间,但是不能拿着时分秒相减,比如05分减去25分,结果会是负的. 可以用时间戳来做,用户输入时间总的毫秒数减去现在时间的总的毫秒数,得到的就是剩余时间的 ...

  6. 开始在Windows上开发Android

    介绍 鉴于您正在阅读这篇文章,您很可能已经知道android是什么了.可能.在科幻小说和电影中,机器人本质上是具有拟人化特征的机器人.还记得<星球大战>里的C-3PO吗?那<星际迷航 ...

  7. [学习笔记] 数位DP的dfs写法

    跟着洛谷日报走,算法习题全都有! 嗯,没错,这次我也是看了洛谷日报的第84期才学会这种算法的,也感谢Mathison大佬,素不相识,却写了一长篇文章来帮助我学习这个算法. 算法思路: 感觉dfs版的数 ...

  8. Azure Media Player Logo隐藏和 视频字幕样式

    <style type="text/css"> /**hide mediaplayer logo*/ .amp-default-skin .amp-content-ti ...

  9. 网站搭建-云服务器ECS的使用

    1. 查看购买的云服务器实例,重置密码 2. 查找IP进行查看,此时网页时不存在的,开始配置: 3. 登录putty或其他终端,进行网页搭建,先按教程走一遍,然后再做个性化处理: #安装Apache ...

  10. Rust之路(4)——所有权

    [未经书面同意,严禁转载] -- 2020-10-14 -- 所有权是Rust的重中之重(这口气咋像高中数学老师 WTF......). 所有权是指的对内存实际存储的数据的访问权(包括读取和修改),在 ...