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最小覆盖子串的更多相关文章

  1. Java实现 LeetCode 76 最小覆盖子串

    76. 最小覆盖子串 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = ...

  2. Leetcode 76.最小覆盖子串

    最小覆盖子串 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "A ...

  3. [LeetCode] 76. 最小覆盖子串 ☆☆☆☆☆(滑动窗口)

    https://leetcode-cn.com/problems/minimum-window-substring/solution/hua-dong-chuang-kou-suan-fa-tong- ...

  4. 【leetcode 76. 最小覆盖子串】解题报告

    思路:滑动窗口思想 方法一:滑动窗口 string minWindow(string s, string t) { // 1.tdict记录T中每个字母与字母个数 // 2.维护一个滑动窗口字母的计数 ...

  5. LeetCode 76. 最小覆盖子串(Minimum Window Substring)

    题目描述 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "ABC ...

  6. [LeetCode]438. 找到字符串中所有字母异位词、76. 最小覆盖子串(滑动窗口解决子串问题系列)

    题目438. 找到字符串中所有字母异位词 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 说明: 字母异位词指字母相同,但排列不同的字符 ...

  7. 【LeetCode】76. 最小覆盖子串

    76. 最小覆盖子串 知识点:字符串:滑动窗口 题目描述 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ...

  8. POJ2185Milking Grid(最小覆盖子串 + 二维KMP)

    题意: 一个r*c的矩形,求一个子矩形通过平移复制能覆盖整个矩形 关于一个字符串的最小覆盖子串可以看这里http://blog.csdn.net/fjsd155/article/details/686 ...

  9. KMP算法 - 求最小覆盖子串

    KMP与最小覆盖子串 最小覆盖子串:对于某个字符串s,它的最小覆盖子串指的是长度最小的子串p,p满足通过自身的多次连接得到q,最后能够使s成为q的子串. 比如: 对于s="abcab&quo ...

随机推荐

  1. 如何查看FQDN

    FQDNFully Qualified Domain Name缩写, 含义完整域名. 例, 台机器主机名(hostname)www, 域缀(domain)example.com, 该主机FQDN应该w ...

  2. Python、mysql四-1:单表查询

    一 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键 ...

  3. golang 方法

    方法: 在函数声明时,在其名字之前放上一个变量,即是一个方法.这个附加的参数会将该函数附 加到这种类型上,即相当于为这种类型定义了一个独占的方法. package main import " ...

  4. Python time、datetime、os、random、sys、hashlib、json、shutil、logging、paramiko、subprocess、ConfigParser、xml、shelve模块的使用

    文章目录: 1. time & datetime模块 2. os模块 3. random模块 4. sys模块 5. hashlib模块 6. json模块 7. shutil模块 8. lo ...

  5. zencart搜索结果页面静态化 advanced_search_result

    首先,确认网站是否安装了ultimate_seo_urls 伪静态模块. 修改include/classes/seo.url.php 大约126行添加代码 'keyword' => 'sale' ...

  6. java8学习之Stream陷阱剖析

    上一次[http://www.cnblogs.com/webor2006/p/8297603.html]在最后用stream.iterate()生成了6个奇数,接着基于它来实现如下需求:找出该流中大于 ...

  7. noi.ac NA534 【猫】

    一眼暴力DP 再一眼决策单调性? 打个表以为是四边形不等式?? 最后发现是斜率优化??? 于是成功写了个假斜率优化真四边形不等式拿了\(80\) 设\(f[i][j]\)表示有\(i\)个工作人员出发 ...

  8. python之路-笔录3[BOM&DOM&JQuery]

    *** 目录 *** 1. BOM 学习 2. DOM 学习 3. jQuery 学习 *** END *** 1. BOM BOM(Browser Object Model)是指浏览器对象模型,它使 ...

  9. JavaScript分支结构Ⅱ—switch-case

    ㈠switch-case 使用场合 优先用于等值判断的条件中   ㈡switch-case 语句执行逻辑 switch case语句是一种特殊的分支结构,可以根据一个表达式的不同取值,从不同的程序入口 ...

  10. 关系型数据库(四),引擎MyISAM和InnoDB

    目录 1.MyISAM和InnoDB关于锁方面的区别是什么 2.MYSQL的两个常用存储引擎 3.MyISAM应用场景 4.InnoDB适合场景 四.引擎MyISAM和InnoDB 1.MyISAM和 ...