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);
    }
};
相关推荐
yi0117 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
YangYang9YangYan8 小时前
2027 秋招|数据科学与大数据技术面试项目价值回答思路,告别纯代码描述
大数据·面试·职场和发展
灯澜忆梦10 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下10 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J10 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛10 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有11 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu11111111 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS11 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b11 小时前
算法日常・每日刷题--<动态规划>14
算法