【剑斩OFFER】算法的暴力美学——最小覆盖字串

一、题目描述

二、算法原理

思路:滑动窗口 + 双哈希表

我们可以统计 t 中每个字母的种类,不是个数,当我们遍历的 s 字符串时,我们也要定义一个 count 来记录符合 t 的有效字符,当 hash_s A == hash_t A ,count++,当 count == t 中每个字母的种类时,此时就是符合要求的字符串,但是我们要长度最小的字符串,所以我们还要定义两个变量:begin:有效字符串的起始下标,minlen :最小的有效字符串的个数;当 count == t 中每个字母的种类时,我们就要更新 begin 和 minlen 。

三、代码实现

cpp 复制代码
class Solution {
public:
    string minWindow(string s, string t) {
        int kinds = 0;
        char hash1[128] = {0};
        for(auto e : t) if(hash1[e]++ == 0) kinds++;

        int count = 0;
        char hash2[128] = {0};
        int minlen = INT_MAX, begin = -1;
        for(int right = 0,left = 0; right < s.size();right++)
        {
            char in = s[right];
            hash2[in]++;
            if(hash2[in] == hash1[in]) count++;
            while(count == kinds)
            {
                if(minlen > right - left + 1) 
                {
                    minlen = right - left + 1;
                    begin = left;
                }
                char out = s[left];
                if(hash2[out] == hash1[out]) count--;
                hash2[out]--;
                left++;
            }
        }
        if(begin == -1) return "";
        else return s.substr(begin,minlen);
    }
};

解题过程中的总结:不能使用容器:unordered_map 来记录每个字母的种类,因为当后面的我们判断 hashout == hash1out 时,此时容器的 size 会增加。

相关推荐
想做小南娘,发现自己是女生喵1 小时前
【无标题】
数据结构·算法
Kx_Triumphs3 小时前
HDU4348 To the moon(主席树区间修改模板)
算法·题解
旖-旎3 小时前
《LeetCode647 回文子串 || LeetCode 5 最长回文子串》
c++·算法·leetcode·动态规划·哈希算法
轻颂呀4 小时前
约瑟夫环问题
算法
六bring个六5 小时前
open Harmony中分布式软总线的学习任务清单
分布式·学习·c/c++·open harmony
科技大视界6 小时前
投资AI项目,传统尽调不够用了——李章虎律师拆解算法、数据、算力三大雷区
人工智能·算法·数据挖掘
郝学胜-神的一滴6 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
Irissgwe6 小时前
算法滑动窗口
数据结构·算法
怪兽学LLM6 小时前
LeetCode 105. 从前序与中序遍历序列构造二叉树:分治递归思路详解
算法·leetcode·职场和发展