首页 > 其他 > 详细

Leetcode 076. 最小覆盖子串 双指针

时间:2020-05-23 17:46:15      阅读:55      评论:0      收藏:0      [点我收藏+]

地址 https://leetcode-cn.com/problems/minimum-window-substring/

给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:

如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。

一个窗口内的连续数组的性质变化, 考虑用双指针来解决这个问题。
我们首先需要解决如何能快速的知道添加或者删除某个字母后 该数组的变化与样例字符串是否接近或者满足条件。这个我们采取哈希表来解决(或者使用数组 以字母的对应的asii表的索引为关键字,也是一种哈希办法)。
l r表示一段活动的字符串 我们通过查哈希表来确认是否已经包含了样例字符串里所有的字母。
如果满足,我们尝试逐步的从左边缩短l r的距离看看能不能找到更短的满足条件的字符串。
如果不满足,我们逐步的从右边扩展l r的距离 看看能否包含样例字符串。
一轮下来,我们就可以得到最短的包含样例字符串的答案了

class Solution {
public:

int sample_map[256];
int inputmap[256];

bool check() {

    for (int i = 0; i < 256; i++) {
        if (inputmap[i] < sample_map[i])
            return false;
    }

    return true;
}

string minWindow(string s, string t) {
    for (int i = 0; i < t.size(); i++) {
        int idx = t[i] - char(0);
        sample_map[idx]++;
    }
    int ans = 999999; string ansStr;

    int l = 0; int r = 0;
    inputmap[s[r]] =1;

    while (l < s.size() && r < s.size()) {
        if (check()) {
            int len = r - l + 1;
            if (len < ans) {
                ans = len; ansStr = s.substr(l, len);
            }
            //尝试从左边缩短字符串 看看是否会依旧包含样例字符串
            inputmap[s[l]]--;
            l++;
        }
        else {
            //已经不满足包含字符串了,从右边扩展字符串
            r++;
            inputmap[s[r]]++;
        }

    }


    return ansStr;
}


};

 

Leetcode 076. 最小覆盖子串 双指针

原文:https://www.cnblogs.com/itdef/p/12943095.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!