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);
    }
};
相关推荐
佳児素花痴╮1 小时前
树的基础知识与查找排序算法
数据结构·算法
lueluelue478 小时前
LeetCode:链表
算法·leetcode·链表
橘子汽水16811 小时前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
huameinan狮子11 小时前
Adaboost算法原理与计算实例
算法
别怪我很水11 小时前
API中提供了VelocityTracker类用于计算触摸事件MotionEvent的速度,而其内部默认使用的方法就是最小二乘法,本 ...
算法·gitee·最小二乘法
Re.不晚14 小时前
挑战做100道力扣算法- DAY1
算法·leetcode·职场和发展
蓝悦无人机14 小时前
《Planning algorithms》读书笔记——第1章 引言
算法·读书笔记·规划算法·lavalle
Sagittarius_A*14 小时前
分组密码基础(二):Feistel 结构与 DES 的设计思想
算法·信息安全·密码学·des·数论
青山木15 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode