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);
    }
};
相关推荐
x_xbx7 分钟前
LeetCode:543. 二叉树的直径
算法·leetcode·职场和发展
QiLinkOS8 分钟前
QiLink 技术委员会选举实施细则
c语言·数据结构·c++·单片机·嵌入式硬件·算法·开源
我材不敲代码12 分钟前
Python基础: 函数超全详解:定义、参数、返回值、作用域与递归
开发语言·python·算法
程序员杰哥15 分钟前
接口自动化测试:多环境配置实战
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
罗超驿18 分钟前
11.LeetCode 1004. 最大连续1的个数 III | 滑动窗口解法详解(Java)
java·算法·leetcode
QiLinkOS22 分钟前
发明人与专利价值共生逻辑
c语言·数据结构·c++·人工智能·单片机·嵌入式硬件·算法
凯瑟琳.奥古斯特24 分钟前
10道数据库原理精选题
开发语言·数据库·职场和发展·数据库开发
计算机安禾33 分钟前
【算法分析与设计】第21篇:回溯法的状态空间树与剪枝函数设计
大数据·人工智能·算法·机器学习·数据挖掘·剪枝
磊 子35 分钟前
STL之set以及set和map区别
开发语言·c++·算法
Promise微笑44 分钟前
算法突围:“双核四驱”理论下的“官网”AI引用概率提升指南
人工智能·算法·chatgpt