leetcode 76 最小覆盖子串

此题一看就是滑动窗口,其实算不上太hard,有两个难点:

  1. judge函数的写法,如何判断候选集合包含模板集合?
  2. 如何存目标子串

对于第一个问题,我们可以用一个128维的数组,因为字母,数字都是ascii码,所以这样最简单最快。如果用哈希表或者树就慢了,特别是树,同一个字符要遍历好多次,才能拿到值

对于第二个问题,我们如果每次都用substr,会每次存都是一个O(N)的复杂度,就超时了,所以存一个左坐标,一个右坐标就行,代码如下:

cpp 复制代码
typedef vector<int> V;

class Solution {
public:
    bool judge(V& t, V& temp)
    {
        for(int i='a';i<='z';i++)
        {
            if(t[i] < temp[i])return 0;
        }
        for(int i='A';i<='Z';i++)
        {
            if(t[i] < temp[i])return 0;
        }
        return 1;
    }

    string minWindow(string s, string t) {
        // 预处理t
        V temp(128, 0), cand(128, 0);
        for(auto c: t)temp[c]++;

        int m = s.size();
        int ans_l = -1, ans_r = m;

        int l = 0;
        for(int r=0;r<m;r++)
        {
            int c = s[r];
            cand[c]++;

            while(judge(cand, temp))
            {
                if(r-l < ans_r-ans_l)
                {
                    ans_l = l;
                    ans_r = r;
                }
                cand[s[l]]--;
                l++;
            }
        }

        if(ans_l < 0)return "";
        return s.substr(ans_l, ans_r-ans_l+1);
    }
};
相关推荐
嵌入式的飞鱼2 小时前
SD NAND的坏块管理算法详解:如何保证数据完整
算法
田梓燊2 小时前
leetcode 240
算法·leetcode·职场和发展
wenhaoran112 小时前
CF1800F Dasha and Nightmares
c++·算法·字符串·codeforces·位运算
We་ct2 小时前
LeetCode 149. 直线上最多的点数:题解深度剖析
前端·javascript·算法·leetcode·typescript
sheeta19982 小时前
LeetCode 每日一题笔记 日期:2026.04.13 题目:1848.到目标元素的最小距离
笔记·算法·leetcode
Anycall.Q2 小时前
RULE (ICLR 2026)
算法
Tisfy2 小时前
LeetCode 1848.到目标元素的最小距离:数组遍历(附python一行版)
python·leetcode·题解·遍历
断眉的派大星2 小时前
数据结构——指针
数据结构·算法
Xpower 172 小时前
算法学习笔记 Day 1:迁移学习与域自适应(DANN/CORAL)
笔记·学习·算法