【LeetCode 76】最小覆盖子串
【题解】
尺取法。
用l和r代表一个合法的覆盖子串。
我们不断地扩大右指针。
直到l..r包含T中的所有字母为止(重复的就要两次以上。)
然后我们可以尝试的让l++.
看看新的l..r是不是还是包含所有的字母。
如果是的话。
显然我们得到了一个更优的解。
而且可以肯定。
我们在递增l的时候
不会漏掉比当前更好的解。
因为如果l可以递增缺不递增。
那么从那个位置开始的最短的子串也只能到达r而已。
不会比l递增之后的结果更优。
因此这个算法是成立的。
判断是否包含所有的字母。
只要用个map来存储每个字母出现的次数就好了。(T字符串中的字母)
然后当r递增的时候。
令map[s[r]]--
如果让s[r]递减的时候第一次变成了0
就说明[l..r]这一段s[r]这个字母出现的次数已经满足了要求。
【代码】
class Solution {
public:
    string minWindow(string s, string t) {
        map<char,int> dic;dic.clear();
        int goal = 0;
        for (int i = 0;i<(int)t.size();i++) {
            dic[t[i]]++;
            if (dic[t[i]]==1) goal++;
        }
        int l = 0;int cnt = 0;
        int ll = -1,rr=-1;
        for (int r = 0;r<(int)s.size();r++){
            dic[s[r]]--;
            if (dic[s[r]]==0) cnt++;
            if (cnt==goal){
                while((l+1)<=r){
                    if (dic[s[l]]<0){
                        dic[s[l]]++;
                    }else break;
                    l++;
                }
                if (ll==-1){
                    ll = l,rr = r;
                }else{
                    if (rr-ll+1>r-l+1){
                        ll = l;rr = r;
                    }
                }
            }
        }
        string anss = "";
        for (int i = ll;i<=rr;i++){
            anss = anss + s[i];
        }
        return anss;
    }
};
【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 76最小覆盖子串
		time O(n) spaceO(n) 的方法: 还是借助哈希表,所有字母初始化为0,将t中出现的所有字母次数全都记录在哈希表里: 采用双指针,分别为一个头指针head,和尾指针tail.flag记录 ... 
- [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 ... 
随机推荐
- 初学Cadence 一
			点击打开 Design Entry CIS 弹出 不要选 OrCAD Capture,这个组件和OrCAD Capture CIS 相比少了很多东西,对元件的管理不方便.选 OrCAD Capture ... 
- Java的常用类 String
			String类: 代表字符串, java程序中的所有字符串字面值(如, "abc")都是此类的实例实现 String是一个final类,代表不可变的字符序列 字符串是常量是用双引号 ... 
- 更新系统时间 & 查看/修改LINUX时区和时间
			一.时区0. date '+%Y%M%D' 按照格式显示当前日期,结果如下: date "+%Y-%m-%d %H:%M:%S" 1. 查看当前时区 :[root@master ~ ... 
- 【ABAP系列】SAP ABAP 总结常用术语简称解析
			公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 总结常用术语简 ... 
- [Linux] 013 其他文件搜索命令
			1. 文件搜索命令:locate 命令名称:locate 命令所在路径:/bin/locate 执行权限:所有用户 语法:locate 文件名 功能描述:在文件资料库中查找文件 范例: $ locat ... 
- Day4 --- Python中的控制结构(if, for, while, try...expect..)
			if for while 可以参考 : https://www.cnblogs.com/HYLering/p/10051906.html try 是异常处理里面的 可以参考 : https://ww ... 
- C#面试 笔试题  四
			1.请你简单的说明数据库建立索引的优缺点 使用索引可以加快数据的查询速度,不过由于数据插入过程中会建索引,所以会降低数据的插入.更新速度,索引还会占磁盘空间. 2.什么是WEB服务控件?使用WEB服务 ... 
- shell脚本从入门到精通(中级)之提高篇
			shell 脚本入门到精通(中级) 一.shell 脚本的执行 二.输出格式化 三.数据类型 四.重定向 五.变量 一.shell 脚本的执行 1. 脚本执行的4种方法 $ ls /tmp/test. ... 
- css标签学习-vertical-align标签
			今天在学习查阅代码的时候,发现了一个不认识的CSS代码,于是进行学习. <html> <head> <style type="text/css"> ... 
- elasticsearch 基础 —— Update API
			Update API 更新API允许基于提供的脚本更新文档.该操作从索引获取文档(与分片并置),运行脚本(使用可选的脚本语言和参数),并对结果进行索引(也允许删除或忽略操作).它使用版本控制来确保在& ... 
