最后更新

一刷
08-Jan-2017

昨天Amazon group面结束,刚回家。
国内以前喜欢的女生结婚了,嘿嘿...好开心呀~~

这次面试感觉自己的做法完爆别人,比什么2 greedy好多了= = 总之表现比想象的好,最后一面的面试官真是聪明得一逼,我的思路稍微说她就明白,跪了,这也太出色了。 我只能说A家对于背题党直接OA拿VIDEO或者OFFER确实水,但是有实力的也有,比如给我面试的这个印度姐姐,屌屌屌。

总之希望自己能过能过。

开始准备Google吧。

言归正传。

一长一短2个String

在长的String里找最短的substring,使得substring包含所有短string的字符。
('a'在短字符串里出现2次,substring里也要出现2次才行)

2 pointers来做的,固定左边,右边往右找,直到substring满足要求。 在往右的过程中,我们可能添加了很多不必要元素:
要满足abc
我们在ab baba cba里找,找到C的时候,添加了baba这段没用的,这个时候尝试左边缩进。

比较通过2个int[256],一个是需要的字符数,一个是现有的。

Time: O(n)
Space: O(1)

public class Solution {public String minWindow(String s, String t) {if (s.length() < t.length()) return "";int[] need = new int[256];int[] count = new int[256];for (char c : t.toCharArray()) {need[c]++;}int right = 0;String res = "";int minLength = Integer.MAX_VALUE;for (int left = 0; left < s.length(); left++) {while (right < s.length() && !contains(need, count)) {count[s.charAt(right++)] ++;}if (right - left < minLength && contains(need, count)) {minLength = right - left;res = s.substring(left, right);}count[s.charAt(left)] --;}return res;}public boolean contains(int[] need, int[] count) {for (int i = 0; i < 256; i++) {if (need[i] > count[i]) {return false;}}return true;}
}

方法二:

也是2 pointers,和一的做法差不多,唯一不同的就是判断是否包含的方法。

方法一是通过比较int[256]来判断是否包含所有character,这里有个别的方法。

比如短string是abcde,那么总共需要5个字符才能满足。但也不是随便5个字符就能满足,只有某些字符才能满足。
比如:
一开始是abcde,需要5个才能满足,而a,b,c,d,e其中任何一个都是有效字符。
假如我们substring中已经有了a和c,需要bde,此时的有效字符就变成了b,d,e,读到b,d,e才可以让需要数字++

同理,缩进也要判断,比如substring里有3个A,缩进最左边缩小了1个A,那么当前需要的元素数量是不变的,因为我们还有2个A可以使用,相反如果缩掉了B,而我们substring里没有B了,总共需要的元素数量就要++

if (--chars[s.charAt(right++)] >= 0) {validRead ++;}

这个说的是,substring读取一个,然后判断是否是有效读取,把那些-- ++之类的给展开就一目了然了,后面的+ + --一样 ,展开再看。

public class Solution {public String minWindow(String s, String t) {if (s.length() == 0 || s.length() < t.length()) return "";String res = "";int minLength = Integer.MAX_VALUE;int[] chars = new int[256];for (char c : t.toCharArray()) {chars[c] ++;}int need = t.length();int validRead = 0;int right = 0;for (int left = 0; left < s.length(); left ++) {while (right < s.length() && validRead < need) {if (--chars[s.charAt(right++)] >= 0) {validRead ++;}}if (validRead >= need && right - left < minLength) {minLength = right - left;res = s.substring(left, right);}if (++chars[s.charAt(left)] > 0) validRead --;   }return res;}
}

方法二是因为后面的题要用到这个办法。

转载于:https://www.cnblogs.com/reboot329/p/6263861.html

76. Minimum Window Substring相关推荐

  1. LeetCode 76. Minimum Window Substring / 567. Permutation in String

    76. Minimum Window Substring 典型Sliding Window的问题,维护一个区间,当区间满足要求则进行比较选择较小的字串,重新修改start位置. 思路虽然不难,但是如何 ...

  2. 【打印代码+好好理解+子串问题】LeetCode 76. Minimum Window Substring

    LeetCode 76. Minimum Window Substring 字符串子串问题!!!理解这题真是花了很大的功夫!!! 参考链接:https://blog.csdn.net/weixin_4 ...

  3. Minimum Window Substring @LeetCode

    不好做的一道题,发现String Algorithm可以出很多很难的题,特别是多指针,DP,数学推导的题.参考了许多资料: http://leetcode.com/2010/11/finding-mi ...

  4. LeetCode - Minimum Window Substring

    题目: Given a string S and a string T, find the minimum window in S which will contain all the charact ...

  5. 72.Minimum Window Substring(最小子串窗口)

    Level:   Hard 题目描述: Given a string S and a string T, find the minimum window in S which will contain ...

  6. LeetCode 笔记系列16.3 Minimum Window Substring [从O(N*M), O(NlogM)到O(N),人生就是一场不停的战斗]...

    题目:Given a string S and a string T, find the minimum window in S which will contain all the characte ...

  7. LeetCode 笔记系列16.1 Minimum Window Substring [从O(N*M), O(NlogM)到O(N),人生就是一场不停的战斗]...

    题目: Given a string S and a string T, find the minimum window in S which will contain all the charact ...

  8. LeetCode 笔记系列16.2 Minimum Window Substring [从O(N*M), O(NlogM)到O(N),人生就是一场不停的战斗]...

    题目:Given a string S and a string T, find the minimum window in S which will contain all the characte ...

  9. Minimum Window Substring 最小覆盖子串算法

    转载:https://blog.csdn.net/fly_yr/article/details/51134340 题目 最小子串覆盖 给定一个字符串source和一个目标字符串target,在字符串s ...

最新文章

  1. Python实用笔记 (16)函数式编程——偏函数
  2. 解决向数据库mysql插入double数据小数点不显示问题
  3. Vue+ElementUI纯前端技术实现对表格数据的增删改查
  4. delphi 折叠代码 快捷键_我收藏的几个更快搬砖的vscode快捷键
  5. HH SaaS电商系统的商品营销角标功能模块设计
  6. C++ STL学习笔记 : 1. template 模板函数
  7. Python 中 PyQt5 + pycharm 调用 Qt Designer,将.ui文件转换成 .py 文件
  8. GitHub | 周志华《机器学习》手推笔记正式开源!可打印版本附pdf下载链接
  9. 使用keytool生成密钥对
  10. 算天数什么时候加一什么时候不加一_陌陌加公会不加公会的区别?
  11. QString、QByteArray 相互转换、和16进制与asc2转换
  12. 卸载office2010后 再安装2013 错误1706 安装程序找不到需要的文件
  13. word中插入罗马数字并且设置为Times New Roman字体
  14. Java的Integer与int互转
  15. oop 商品信息按商品名称查询 商品按价格排序 内含测试类
  16. python画图之小坦克
  17. 互联网,大数据和人工智能对我们的生活带来的影响
  18. 【xss-labs】闯关记录16~18
  19. 盘点 深度学习妖怪 之 激活函数妖
  20. python+selenium实现淘宝双十一自动下单

热门文章

  1. c++ for循环 流程图_python 零基础必知--条件控制与循环语句
  2. python众数问题给定含有n个元素的多重集合s_分治法求众数 给定含有n个元素的多重集合S 联合开发网 - pudn.com...
  3. Win32ASM学习[23]:RadASM快捷键
  4. leetcode 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树思考分析
  5. Opencv——图像金字塔与图像尺寸缩放
  6. scala部分应用函数_Scala中的部分函数
  7. 二、VC++环境的安装
  8. 显示照片的RGB直方图
  9. python如何操作oracle数据库_python操作oracle数据库
  10. 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符