📌  相关文章
📜  包含字符串本身所有字符的最小窗口(1)

📅  最后修改于: 2023-12-03 15:22:47.576000             🧑  作者: Mango

包含字符串本身所有字符的最小窗口
什么是包含字符串本身所有字符的最小窗口

包含字符串本身所有字符的最小窗口,是指在一个字符串中,找出包含另一个字符串中所有字符的最短子字符串。

问题描述

给定字符串 s 和字符串 t,请在 s 中找出包含 t 所有字符的最小子串。

示例:

输入:s = "ADOBECODEBANC", t = "ABC" 输出:"BANC"

注意

  • 如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""
  • 如果存在多个涵盖 t 所有字符的子串,返回任意一个即可。
解决办法

思路:滑动窗口

时间复杂度:$O(n)$

空间复杂度:$O(n)$

算法实现:

class Solution {
public:
    string minWindow(string s, string t) {
        if(s.empty() || s.size() < t.size())
            return "";
        vector<int> hash(128, 0);
        for(int i = 0; i < t.size(); i++)
        {
            hash[t[i]]++;
        }
        int left = 0, right = 0, count = t.size(), minl = s.size() + 1, start = 0;
        while(right < s.size())
        {
            if(hash[s[right]] > 0)
            {
                count--;
            }
            hash[s[right]]--;
            right++;
            while(count == 0)
            {
                if(right - left < minl)
                {
                    start = left;
                    minl = right - left;
                }
                if(hash[s[left]] == 0)
                {
                    count++;
                }
                hash[s[left]]++;
                left++;
            }
        }
        if(minl > s.size())
            return "";
        return s.substr(start, minl);
    }
};

其中,用到了滑动窗口算法,即:

  • 初始化左右指针和记录字符串 t 中字符出现的次数的哈希表;
  • 移动右指针,对哈希表进行操作,更新哈希表中字符串的存在状态,并记录 count 值;
  • count 值为 $0$ 时,移动左指针,计算子字符串长度,更新最小子字符串长度。

除此之外,我们还需要注意一些细节问题,比如:

  • 如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""
  • 如果存在多个涵盖 t 所有字符的子串,返回任意一个即可。
总结

本题是一道非常经典的字符串问题,考察了算法的基本功,也考察了你对细节的处理能力。掌握该问题的解决办法,实际上也是一种非常好的思考方式和编程技巧,有很高的参考价值。