博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 76最小覆盖子串
阅读量:6318 次
发布时间:2019-06-22

本文共 1654 字,大约阅读时间需要 5 分钟。

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 == 0 || lt == 0 ) return "";        vector
h(128, 0); for(auto c:t) h[c]++; int head=0,tail=0,start=0,len=INT_MAX; int flag=lt;//>0移动末尾,等于0移动head; while(head
=0) flag--; tail++; }else{ if(tail-head
0) 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=-1,lon=-1;        string res=s;        for(int i=k-1;i
h(t.begin(),t.end()); while(j>=0){ if(h.count(s[j])) h.erase(h.find(s[j])); if(h.size()==0){ if(lon<0 || lon>i-j+1) {lon=i-j+1;tail=i;} break; } j--; } } if(tail==-1) return ""; res=s.substr(tail-lon+1,lon); return res; }};

转载于:https://www.cnblogs.com/joelwang/p/11015003.html

你可能感兴趣的文章
RecyclerView综合案例库和系列博客
查看>>
TensorFlow Build from Source for macOS
查看>>
前端路由原理解析和实现
查看>>
SpringBoot
查看>>
北邮前期准备
查看>>
ES5和ES6中对继承的实现
查看>>
Introducting To Siri Shortcuts
查看>>
前端知识储备
查看>>
阻塞同步 异步
查看>>
小程序分页加载
查看>>
JAVA 并发之路 (二) 线程安全性
查看>>
从0开始学习BFC
查看>>
'npm' 不是内部或外部命令,也不是可运行的程序
查看>>
Android动态绘制饼状图
查看>>
数据结构进阶篇-红黑树
查看>>
前端开发学习Day21
查看>>
iOS SDK开发(入门指南)
查看>>
JS写的一个抽奖小Demo从普通写法到设计模式再向ES6的进阶路程
查看>>
十分钟弄懂:数据结构与算法之美 - 时间和空间复杂度
查看>>
Android彻底掌握网络通信
查看>>