Minimum Window Substring

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.

 

分析:暴力解决可以在O(n^2)时间复杂度内完成:遍历S,当碰到T中的首字母时,以该字母为窗口起始位置找到一个最小窗口包含所有T中的字符,最后取所有窗口的最小值。在暴力方法中我们做了很多重复的事情,比如S = “aabc”,T = “abc”,当我们以第一个a为窗口起始位置遍历时,我们要判断b、c是否在T中,当我们以第二个a为窗口起始位置遍历时,我们还要判断b、c是否在T中。那么怎样避免这种重复的工作呢?

 

可以利用两个指针扫描(两个指针分别为start,i),以S = “e b a d b a c c b”(忽略空格),T = “abc”为例:

                                                                            0 1 2 3 4 5 6 7 8

  1. 初始化 start = i = 0
  2. i 逐渐往后扫描S直到窗口S[start…i]包含所有T的字符,此时i = 6(字符c的位置)
  3. 缩减窗口:此时我们注意到窗口并不是最小的,需要调整 start 来缩减窗口。缩减规则为:如果S[start]不在T中 或者 S[start]在T中但是删除后窗口依然可以包含T中的所有字符,那么start = start+1, 直到不满足上述两个缩减规则。缩减后i即为窗口的起始位置,此例中从e开始窗口中要依次删掉e、b、a、d,start最后等于4 ,那么得到一个窗口大小为6-4+1 = 3
  4. start = start+1(此时窗口肯定不会包含所有的T中的字符),跳转到步骤2继续寻找下一个窗口。本例中还以找到一个窗口start = 5,i = 8,比上个窗口大,因此最终的最小窗口是S[4…6]

具体实现时,要用哈希表来映射T中字符以便在O(1)时间内判断一个字符是否在T中,由于是字符缘故,可以用数组简单的来实现;还需要一个哈希表(map<char,int>)来记录扫描时T中的某个字符在S中出现的次数,也可以用数组实现

C++代码实现:

#include<iostream>
#include<string>
using namespace std;

class Solution {
public:
    string minWindow(string S, string T) {
        int lens=S.length();
        int lent=T.length();
        int tcnt[256]={0};
        int fcnt[256]={0};
        int i,start;
        int found=0;
        int winStart=-1,winEnd=lens;
        for(i=0;i<lent;i++)
            tcnt[T[i]]++;
        for(i=0,start=0;i<lens;i++)
        {
            if(tcnt[S[i]]!=0)
            {
                fcnt[S[i]]++;
                if(fcnt[S[i]]<=tcnt[S[i]])
                    found++;
                if(found==lent)
                {
                    //找到一个窗口之后调整start的位置
                    while(tcnt[S[start]]==0||fcnt[S[start]]>tcnt[S[start]])
                    {
                        if(tcnt[S[start]])
                            fcnt[S[start]]--;
                        start++;
                    }
                    if(i-start<winEnd-winStart)
                    {
                        winStart=start;
                        winEnd=i;
                    }
                    fcnt[S[start]]--;
                    start++;
                    found--;
                }
            }
        }
        return winStart==-1?"":S.substr(winStart,winEnd-winStart+1);
    }
};

int main()
{
    Solution s;
    string S="SADOBECODEBANC";
    string T="ABC";
    cout<<s.minWindow(S,T)<<endl;
}

 

时间: 2024-09-22 17:11:11

Minimum Window Substring的相关文章

[LeetCode]76.Minimum Window Substring

题目 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 wi

[经典面试题][搜狗]在一个字符串中寻找包含全部出现字符的最小字串

题目 一个字符串中含有n个字符,其中有m个不同的字符,n>>m,用最少的时间和空间找到包含所有这m个字符的最短的字串,不考虑特殊字符,只考虑字母数字即可. 例如: abccbaddac, 返回:cbad aabcadbbbcca,返回:bcad 思路 [算法系列之二十二]包含T全部元素的最小子窗口 本题目相比连接中所说的稍微简单一些,本题目不用考虑重复字符. 代码 /*--------------------------------------------- * 日期:2015-02-24 *

leetcode难度及面试频率

转载自:LeetCode Question Difficulty Distribution               1 Two Sum 2 5 array sort         set Two Pointers 2 Add Two Numbers 3 4 linked list Two Pointers           Math 3 Longest Substring Without Repeating Characters 3 2 string Two Pointers      

LeetCode总结【转】

转自:http://blog.csdn.net/lanxu_yy/article/details/17848219 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近完成了www.leetcode.com的online judge中151道算法题目.除各个题目有特殊巧妙的解法以外,大部分题目都是经典的算法或者数据结构,因此做了如下小结,具体的解题思路可以搜索我的博客:LeetCode题解 题目 算法 数据结构 注意事项 Clone Graph BFS 哈希表 Word Ladder II

LeetCode All in One 题目讲解汇总(持续更新中...)

终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博主啊,多谢多谢,祝大家刷得愉快,刷得精彩,刷出美好未来- 博主制作了一款iOS的应用"Leetcode Meet Me",里面有Leetcode上所有的题目,并且贴上了博主的解法,随时随地都能

[LeetCode] Smallest Range 最小的范围

You have k lists of sorted integers in ascending order. Find the smallest range that includes at least one number from each of the k lists. We define the range [a,b] is smaller than range [c,d] if b-a < d-c or a < c if b-a == d-c. Example 1: Input:[

[算法系列之二十二]包含T全部元素的最小子窗口

题目描述 给定一个包含一系列字符的集合T和字符串S,请在字符串S中找到一个最小的窗口,这个窗口中必须包含T中的所有字符. 例如, S = "ADOBECODEBANC" T = "ABC" 最小窗口是"BANC" 分析 这是一个有趣的问题,这个有趣的问题有多种方法来解决,最好的方法是非常简单,美丽的. 在这篇文章中,我首先说明了一个方法,是我第一次遇见这个问题时想到的.我的第一个方法有点复杂,同时也不是最好的解决方案(时间复杂度为O(NlgM))

Visual Style中的shellstyle.dll文件修改方法_应用技巧

Visual Style中的shellstyle.dll文件修改  2007-3-8 11:25:00  作者: Silencer  shellstyle.dll修改 *部分内容参考自whistl3r的Shellstyle Tutorial 预备知识 1.shellstyle.dll的结构 UIFiles: UIFile1:定义窗体及任务列表样式 UIFile2:定义控制面板样式 Resources:资源文件列表 10,11,12:音乐文件夹 13,14,15:图片文件夹 16,17,18:查找

求助: 为何我这个代码里的事件会自动被window对象触发

问题描述 求助: 为何我这个代码里的事件会自动被window对象触发 用onchange绑定了一个事件,然而每次刷新页面会自动触发这个事件,alert了事件源获得了window对象 求解~~~~ 代码如下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <