leetcode 76. Minimum Window Substring

题目:
这里写图片描述

难度: hard

思路: O(n)复杂度下感觉要用哈希表,使用两个指针,指向进行的首尾,当发现有包含T字符串的序列时,移动首指针,缩小氛围,大体思路是这样,但是具体细节和代码实现写不出来-,-。 再读懂了其他解答的情况下实现了代码

AC解:

class Solution {
public:
    string minWindow(string s, string t) {
        //counter记录t字符串序列中还有多少个在end - start所指序列未包含的
        int start = 0, end = 0, counter = t.length();
        int minStart = 0, minLen = INT_MAX;
        vector<int> m(128, 0);
        //统计t中每个字符出现的次数
        for (auto a : t) m[a]++;

        int len = s.length();
        while (end < len) {
            //m[s[end]] > 0 说明是此字符还未包含在end - start序列中
            if (m[s[end]] > 0)
                counter--;
            m[s[end]]--;    //如果s[end]不是T字符串中的字符,或者个数多余了T中的个数,那么则是负数
            end++;

            //end - start序列完整包含了T中所有字符
            while (counter == 0) {
                if (end - start < minLen) {
                    minLen = end - start;
                    minStart = start;
                }
                /*下面是比较难理解的,因为要移动指针start,所以m[s[start]]++
                  把这个字符从end - start中移除,如果移除了m[s[start]] > 0 说明
                  这个字符是T中的字符,并且在start + 1 ~ end的序列中没有多余的,那么
                  就需要counter++来重新统计此字符。 m[s[start]] <= 0 则说明此字符在
                  start + 1 ~ end序列中有多余的,while循环继续缩小范围*/
                m[s[start]]++;
                if (m[s[start]] > 0)
                    counter++;

                start++;    
            }
        }

        return minLen == INT_MAX ? "" : s.substr(minStart, minLen);
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值