Leetcode每日刷题之76.最小覆盖子串(C++)

1.题目解析

本题的题目是给定两个字符串 s 和 t ,找出在 s 中的某个最小子串保证该子串中包含所以 t 中出现的字母即可,并且该结果是唯一答案,找不到结果就直接返回空串即可

2.算法原理

关于本题的核心思路就是"滑动窗口",具体实现是:

1.首先给定两个指针left和right,使用count统计窗口内有效字符的种类,之所以不是有效字符的个数是因为在最小子串中只要完全包含t中的所以字母即可,不需要一一对应,然后使用kinds统计t中的字母种类个数

2.right指针不断向右移动以达到进窗口的目的,在进窗口之后判断进入的字母种类个数是否完全等于t中该字符种类个数,如果等于则count++即窗口内有效字母种类增加

3.当count == kinds即窗口内有效字母种类出现频次等于t中所有字母种类个数时更新最下字符串长度,然后执行出窗口操作

4.出窗口之前需要判断即将出窗口的字母在窗口内出现的频次是否完全等于t中该字母出现频次,如果等于则代表该字符出窗口会导致窗口内有效字母的种类频次减少,则count--

5.最后判断最小子串是否存在,存在则直接返回,反之返回空串

3.代码展示

cpp 复制代码
class Solution {
public:
    string minWindow(string s, string t) 
    {
        int hash1[128] = { 0 };//统计 t 中所有字母出现次数
        int kinds = 0;//统计 t 中字母种类
        int minlen = INT_MAX;
        int begin = -1;
        for(auto ch : t)
        {
            if(hash1[ch]++ == 0)
            {
                kinds++;
            }
        }

        int hash2[128] = { 0 };//统计窗口内每个字母出现频次
        for(int left = 0,right = 0,count = 0;right < s.size();right++)
        {
            char in = s[right];
            //进窗口 + 维护
            if(++hash2[in] == hash1[in])
            {
                count++;
            }
            //判断出窗口
            while(count == kinds)
            {
                if(minlen > right - left + 1)
                {
                    minlen = right - left + 1;
                    begin = left;
                }
                //出窗口 + 维护 count
                char out = s[left++];
                if(hash2[out]-- == hash1[out])
                {
                    count--;
                }
            }
        }
        if(begin == -1)
        {
            return "";
        }
        else
        {
            return s.substr(begin,minlen);
        }
    }
};
相关推荐
WL学习笔记2 小时前
vector模拟实现
c++
蜗牛一步步往上爬4 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
likexuec6 小时前
数据结构(2)
数据结构
文丑颜不良啊7 小时前
LeetCode2221~2240题目解析
java·leetcode
Navigator_Z7 小时前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode
wo_jack8 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
D e re k ZH8 小时前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶9 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
文丑颜不良啊9 小时前
LeetCode2161~2180题目解析
java·leetcode