76. Minimum Window Substring

来源:互联网 发布:爱奇艺cyida软件源 编辑:程序博客网 时间:2024/04/30 04:52
  1. 问题描述
    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 empty string “”.

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

    Subscribe to see which companies asked this question.

  2. 解决思路
    简而言之,就是利用两个指针(begin,end)和一个计数器来进行计算window长度和判断是否达到子串的约束(这里就是每个单词都出现)
    看到leetcode的大神用一个模版解决了类似的寻找有约束子串的问题。不得不服啊。 还是贴代码吧。 天天跪拜大神。

  3. 代码

模版代码

int findSubstring(string s){        vector<int> map(128,0);        int counter; // check whether the substring is valid        int begin=0, end=0; //two pointers, one point to tail and one  head        int d; //the length of substring        for() { /* initialize the hash map here */ }        while(end<s.size()){            if(map[s[end++]]-- ?){  /* modify counter here */ }            while(/* counter condition */){                  /* update d here if finding minimum*/                //increase begin to make it invalid/valid again                if(map[s[begin++]]++ ?){ /*modify counter here*/ }            }              /* update d here if finding maximum*/        }        return d;  }

本题解决代码

class Solution {public:    string minWindow(string s, string t) {        vector<int> map(128,0);        for (int i = 0; i < t.size(); ++i)            ++map[t[i]];        int begin = 0, end = 0, head = 0, d = INT_MAX;        int counter = t.size();        while(end < s.size()) {            if (map[s[end++]]-- > 0) --counter;            while(counter == 0) {                if (d > end-begin) {                    d = end - begin;                    head = begin;                }                if (map[s[begin++]]++ == 0) {                    ++counter;                }            }        }        return d == INT_MAX ? "" : s.substr(head,d);    }};
0 0