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);
    }
};
相关推荐
MediaTea9 小时前
AI 术语通俗词典:C4.5 算法
人工智能·算法
Navigator_Z10 小时前
LeetCode //C - 1033. Moving Stones Until Consecutive
c语言·算法·leetcode
WBluuue10 小时前
数据结构与算法:莫队(一):普通莫队与带修莫队
c++·算法
风筝在晴天搁浅10 小时前
n个六面的骰子,扔一次之后和为k的概率是多少?
算法
MATLAB代码顾问12 小时前
Python实现蜂群算法优化TSP问题
开发语言·python·算法
代码飞天12 小时前
机器学习算法和函数整理——助力快速查阅
人工智能·算法·机器学习
jiushiapwojdap12 小时前
LU分解法求解线性方程组Matlab实现
数据结构·其他·算法·matlab
笨笨饿12 小时前
69_如何给自己手搓一个串口
linux·c语言·网络·单片机·嵌入式硬件·算法·个人开发
纽扣66713 小时前
【算法进阶之路】链表进阶:删除、合并、回文与排序全解析
数据结构·算法·链表
消失的旧时光-194313 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法