76. Minimum Window Substring

  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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值