leetcode 76最小覆盖子串

time O(n) spaceO(n) 的方法:
还是借助哈希表,所有字母初始化为0,将t中出现的所有字母次数全都记录在哈希表里;
采用双指针,分别为一个头指针head,和尾指针tail。flag记录当前[head,tail)没有出现的字母的个数;
1. flag不为0时,更改s[tail]的哈希值,即h[s[tail]]--;在t中没有出现的字符哈希值会被减为负数,所以如果h[s[tail]]>=0,那么当前值在t中出现过,flag--;最后向右延伸tail,tail++;
2. 可知flag为0时,t中所有的字母都已经在[head,tail)中出现,因此可以比较并记录当前结果的起始位置start和长度len,并且尝试从head缩短当前的子串;
h[s[head]]++;之后,只有在t中出现的字母哈希值可能大于0,没有出现的一定小于等于0;如果是t中出现的(即 h[s[head]]>0),则令flag++,类似于出栈的操作;最后向右移动head,即head++;
总之是借哈希表,通过双指针和flag,维护一个window,
class Solution {
public:
    string minWindow(string s, string t) {
        //将是否已经出现全部的t作为判断条件,如果没有,则不断的增加尾部;如果已经满足,则增加头部;time O(n),space O(n)
        int ls=s.size(),lt=t.size();
        if( ls ==  || lt ==  ) return "";
        vector<int> h(, );
        for(auto c:t)
            h[c]++;
        int head=,tail=,start=,len=INT_MAX;
        int flag=lt;//>0移动末尾,等于0移动head;
        while(head<ls && tail<=ls){
            if(flag){
                if(tail==ls) break;
                h[s[tail]]--;//所有字母都--,那么之后执行++时未出现在t中的字母一定不会超过0;
                if(h[s[tail]]>=) flag--;
                tail++;
            }else{
                if(tail-head<len){
                    start=head;
                    len=tail-head;
                }
                h[s[head]]++;
                if(h[s[head]]>) flag++;//对应所有字母都--的操作
                head++;
            }
        }
        return len==INT_MAX? "":s.substr(start,len);
    }
};
下面方法有2个测试样例超时 time O(n2) space O(n)
class Solution {
public:
    string minWindow(string s, string t) {
        //time O(n2) space O(1);
        int len=s.size(),k=t.size();
        int tail=-,lon=-;
        string res=s;
        for(int i=k-;i<len;i++){
            int j=i;
            multiset<int> h(t.begin(),t.end());
            while(j>=){
                if(h.count(s[j])) h.erase(h.find(s[j]));
                if(h.size()==){
                    if(lon< || lon>i-j+) {lon=i-j+;tail=i;}
                    break;
                }
                j--;
            }
        }
        if(tail==-) return "";
        res=s.substr(tail-lon+,lon);
        return res;
    }
};
leetcode 76最小覆盖子串的更多相关文章
- Java实现 LeetCode 76 最小覆盖子串
		
76. 最小覆盖子串 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = ...
 - Leetcode 76.最小覆盖子串
		
最小覆盖子串 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "A ...
 - [LeetCode] 76. 最小覆盖子串 ☆☆☆☆☆(滑动窗口)
		
https://leetcode-cn.com/problems/minimum-window-substring/solution/hua-dong-chuang-kou-suan-fa-tong- ...
 - 【leetcode 76. 最小覆盖子串】解题报告
		
思路:滑动窗口思想 方法一:滑动窗口 string minWindow(string s, string t) { // 1.tdict记录T中每个字母与字母个数 // 2.维护一个滑动窗口字母的计数 ...
 - LeetCode 76. 最小覆盖子串(Minimum Window Substring)
		
题目描述 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "ABC ...
 - [LeetCode]438. 找到字符串中所有字母异位词、76. 最小覆盖子串(滑动窗口解决子串问题系列)
		
题目438. 找到字符串中所有字母异位词 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 说明: 字母异位词指字母相同,但排列不同的字符 ...
 - 【LeetCode】76. 最小覆盖子串
		
76. 最小覆盖子串 知识点:字符串:滑动窗口 题目描述 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ...
 - POJ2185Milking Grid(最小覆盖子串 + 二维KMP)
		
题意: 一个r*c的矩形,求一个子矩形通过平移复制能覆盖整个矩形 关于一个字符串的最小覆盖子串可以看这里http://blog.csdn.net/fjsd155/article/details/686 ...
 - KMP算法 - 求最小覆盖子串
		
KMP与最小覆盖子串 最小覆盖子串:对于某个字符串s,它的最小覆盖子串指的是长度最小的子串p,p满足通过自身的多次连接得到q,最后能够使s成为q的子串. 比如: 对于s="abcab&quo ...
 
随机推荐
- 移远模组-BC95-工作模式之间关系
			
三种连接状态下,均可发送上行数据( CoAP/UDP): IDLE 下发送数据, 模块会进入 CONNECT 状态: PSM 下发送是数据会唤醒模块, 进入 CONNECT,或者当 TAU(TAU 的 ...
 - WinMain lpCmdLine
			
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lpCmdLine, int){ //命令行参数 TCHAR pCommandLine[2 ...
 - 亲爱的SAP从业者们,烦请做个SAP知识学习种类的小调查
			
"世上再也没有比时钟更加冷漠的东西了:在您出生的那一刻,在您尽情地摘取青春幻梦的花朵的时刻,它都是同样分秒不差地滴答着." -- 高尔基 2019年马上又要离我们而去了,从2018 ...
 - 遗传算法解决寻路问题——Python描述
			
概要 我的上一篇写遗传算法解决排序问题,当中思想借鉴了遗传算法解决TSP问题,本质上可以认为这是一类问题,就是这样认为:寻找到一个序列X,使F(X)最大. 详解介绍 排序问题:寻找一个序列,使得这个序 ...
 - jumpserver部署0.3版本 =====( ̄▽ ̄*)b
			
jumpserver概述 跳板机概述: 跳板机就是一台服务器,开发或运维人员在维护过程中首先要统一登录到这台服务器,然后再登录到目标设备进行维护和操作: 跳板机缺点:没有实现对运维人员操作行为的控制和 ...
 - UVA - 1640 The Counting Problem (数位dp)
			
题意:统计l-r中每种数字出现的次数 很明显的数位dp问题,虽然有更简洁的做法但某人已经习惯了数位dp的风格所以还是选择扬长避短吧(说白了就是菜啊) 从高位向低位走,设状态$(u,lim,ze)$表示 ...
 - 我说CMMI之五:CMMI 4个等级的区别--转载
			
我说CMMI之五:CMMI 4个等级的区别 了解CMMI的人都知道CMMI有5个等级,但是要将5个等级的区别真正说明白,说透彻不太容易.下面我们用一个表格概括之.表格中并没有1级,1级在CMMI中没有 ...
 - JAVA学习第二周课后作业
			
Java 的基本运行单位是类.类由数据成员和函数成员组成.变量之间可以相互转换.String是一个类.static是静态.全局的意思.经过测试,Java的枚举类型定义的Size与String一样都不是 ...
 - PLT hook笔记
			
1. hook技术概述 hook技术是一种拦截用户函数调用的技术.通过hook技术可以实现统计用户对某些函数的调用次数,对函数注入新的功能的目标.在Linux平台,Hook技术可以分成用户和内核 ...
 - 关系型数据库(七),复杂SQL语句
			
目录 1.SQL语句由六部分组成 2.Group By 和HAVING 七.复杂SQL语句 1.SQL语句由六部分组成 Select *** From *** Where *** Group B ...