zoukankan      html  css  js  c++  java
  • Leetcode 076. 最小覆盖子串 双指针

    地址 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;
    }
    
    
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    织梦当前位置去除最后字符
    一霎清明雨,实现考勤管理。
    浅谈:C#中的非泛型集合
    简述结构和类的区别
    项目经理评分系统
    那些年我们一起~做过的魔兽系统
    浅谈:什么是.NET
    MyKTV系统项目的感想
    开发“航班查询及预定”系统
    java面试的一些问题
  • 原文地址:https://www.cnblogs.com/itdef/p/12943095.html
Copyright © 2011-2022 走看看