Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).

For example,
S = "ADOBECODEBANC"
T = "ABC"

Minimum window is "BANC".

Note:
If there is no such window in S that covers all characters in T, return the empty string "".

If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.

问题: 给定字符串 S 和 T ,求 S 中包含所有 T 中字符的最小子字符串。

值得一提的是,“包含所有 T 中的字符”,是要包含 T 中所有字符以及对应的个数。在 T 中重复出现的字符,在最后答案中也需要包含相同个数的重复字符。第一次解没有理解到这个点,提出结果错误,意识到这个点后,修正并提交成功。

解题思路采用的也是 滑动窗口算法(Slide Window Algorithm),LeetCode 把这样的算法归类到 双指针(Two Pointers)类型,算法思路和前面的 Longest Substring Without Repeating Characters 以及 Minimum Size Subarray Sum 相似。

设下标 l 和 r,把左开右闭 [l, r) 想象成一个窗口。

  • 当窗口包含所有 T 中的字符时,则此时的窗口是一个可行解,l++
  • 当窗口没有包含所有 T 中的字符时,则 r++;

如何判断窗口是否包含所有 T 中的字符呢?我使用了 map<char, alphStatus> 来表示,其中 alphStatus 只包含两个值:对应的字符在 T 中出现次数(target),以及当前窗口包含该字符的个数(cur)。可见,当 cur > target 时,对应字符满足被包含条件。

当所有字符都满足被包含条件时,当前窗口便是一个可行解。

找出所有可行解中窗口最小的,便是原题目的解。

class alphStatus{
public:
int target = ;
int cur = ;
}; string minWindow(string s, string t) { if (s.size() == ) {
return (s == t) ? s : "";
} int l = ;
int r = ;
map<char, alphStatus> alph_status; for (int i = ; i < t.size(); i++) {
alph_status[t[i]].target++;
} if (alph_status.count(s[]) != ) {
alph_status[s[]].cur = ;
} string res = s + "$"; while (r <= s.size()) { bool isAllConted = true; map<char, alphStatus>::iterator m_iter;
for (m_iter = alph_status.begin(); m_iter != alph_status.end(); m_iter++) { if (m_iter->second.cur < m_iter->second.target) {
isAllConted = false;
break;
}
} if ( isAllConted ) { if (r-l < res.size()) {
res = s.substr(l, r-l);
} if (alph_status.count(s[l]) != ) {
alph_status[s[l]].cur--;
}
l++; }else{ if (r < s.size() && alph_status.count(s[r]) != ) {
alph_status[s[r]].cur++;
}
r++;
}
} return ((int)res.size() == (int)s.size()+) ? "" : res;
}

[LeetCode] 76. Minimum Window Substring 解题思路的更多相关文章

  1. [LeetCode] 76. Minimum Window Substring 最小窗口子串

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  2. [leetcode]76. Minimum Window Substring最小字符串窗口

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  3. Leetcode#76 Minimum Window Substring

    原题地址 用两个指针分别记录窗口的左右边界,移动指针时忽略那些出现在S种但是没有出现在T中的字符 1. 扩展窗口.向右移动右指针,当窗口内的字符即将多于T内的字符时,停止右移 2. 收缩窗口.向右调整 ...

  4. 刷题76. Minimum Window Substring

    一.题目说明 题目76. Minimum Window Substring,求字符串S中最小连续字符串,包括字符串T中的所有字符,复杂度要求是O(n).难度是Hard! 二.我的解答 先说我的思路: ...

  5. 【LeetCode】76. Minimum Window Substring

    Minimum Window Substring Given a string S and a string T, find the minimum window in S which will co ...

  6. 【leetcode】Minimum Window Substring (hard) ★

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  7. 76. Minimum Window Substring (String, Map)

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  8. 【一天一道LeetCode】#76. Minimum Window Substring

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  9. 【LeetCode】76. Minimum Window Substring 最小覆盖子串(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 滑动窗口 日期 题目地址: https://leet ...

随机推荐

  1. git revert all changes

    点击打开链接https://www.kernel.org/pub/software/scm/git/docs/git-reset.html # Revert changes to modified f ...

  2. 【Android】 Sqlite3 not found

    调试机没有sqlite3命令文件 导入即可 sqlite3 http://pan.baidu.com/s/1bohTMiz //(使用老版sqlite3需要导入libncurses.so文件至/sys ...

  3. php 相对路径中 及 绝对路径中 的一些问题

    写本篇文章,是为了以后学习中遇到问题好解决 php的相对路径是以当前工作目录为基准的,并不是以当前处理的文件目录为基准,这样导致我们在开发过程中总会遇到一些问题. 但是如果我们使用绝对路径,就会导致后 ...

  4. 【web安全】第四弹:防火墙技术笔记

    参考资料: <黑客攻防演习>第二版   Ed SKoudis  Tom Liston著 <防火墙.入侵检测与VPN> 马春光 郭方方著 OSI在理论上将网络分为七层,物理层.数 ...

  5. Areas(区域)

    Areas(区域) 原文:Areas作者:Dhananjay Kumar 和 Rick Anderson翻译:耿晓亮(Blue)校对:许登洋(Seay) Areas 是 ASP.NET MVC 用来将 ...

  6. java MYSQL做分页

    MySql中查询语句实现分页功能 语句: select * from 表名 where 条件 limit 要找第几页,每页多少行; import java.util.*; import java.sq ...

  7. Java精确计算

    Java精确计算 如果我们编译运行下面这个程序会看到什么? public class Test{ public static void main(String args[]){ System.out. ...

  8. 时序图(Sequence Diagram)

    控制焦点Focus on Control 的取值: Alternative fragment(denoted “alt”) 与 if…then…else对应 Option fragment (deno ...

  9. 防御XSS攻击的七条原则

    本文将会着重介绍防御XSS攻击的一些原则,需要读者对于XSS有所了解,至少知道XSS漏洞的基本原理,如果您对此不是特别清楚,请参考这两篇文章:<Stored and Reflected XSS ...

  10. uva 1267 - Network

    这个题目关键在于把无根树变成有根树:这个用dfs: 然后用贪心的方法,从最深的那层开始,每次找到节点的上k层,建一个服务器,然后用一个dfs把这个服务器能够覆盖的节点标记: #include<c ...