1. import java.util.HashMap;
  2. import java.util.Map;
  3. /**
  4. *
  5. * Source : https://oj.leetcode.com/problems/minimum-window-substring/
  6. *
  7. *
  8. * Given a string S and a string T, find the minimum window in S which will
  9. * contain all the characters in T in complexity O(n).
  10. *
  11. * For example,
  12. * S = "ADOBECODEBANC"
  13. * T = "ABC"
  14. *
  15. * Minimum window is "BANC".
  16. *
  17. * Note:
  18. *
  19. * > If there is no such window in S that covers all characters in T,
  20. * return the emtpy string "".
  21. *
  22. * > If there are multiple such windows, you are guaranteed that there
  23. * will always be only one unique minimum window in S.
  24. *
  25. */
  26. public class MinimumWindowSubstring {
  27. /**
  28. * 寻找S中包含T的最短字符串
  29. *
  30. * 窗口的方法,
  31. * 先将T中所有字符保存在hash表中,值为每个字符出现的次数
  32. * 从头开始遍历,判断该字符是否在hash表中,如果在,则将该字符对应的值减1,并记录此时已包含T中字符总数
  33. * 如果字符总数等于T的长度说明找到一个子串,找到第一个包含T的字符串,然后将此时子串的长度和之前最小长度比较,更新最小字串的长度,并记录此时子串的起始位置
  34. * 然后移动子串的左边界,略过不再T中的字符
  35. * 当遍历完成的时候,记录的最小字串的起始位置和最小字串的长度可以得到包含T的最小字串
  36. *
  37. * @param S
  38. * @param T
  39. * @return
  40. */
  41. public String findMinimumWindowSubString (String S, String T) {
  42. Map<Character, Integer> map = new HashMap<Character, Integer>();
  43. // 初始化hash表
  44. for (int i = 0; i < T.length(); i++) {
  45. if (map.keySet().contains(T.charAt(i))) {
  46. map.put(T.charAt(i), map.get(T.charAt(i)) + 1);
  47. } else {
  48. map.put(T.charAt(i), 1);
  49. }
  50. }
  51. int minLen = S.length();
  52. int left = 0;
  53. int minStart = 0;
  54. int count = 0;
  55. for (int i = 0; i < S.length(); i++) {
  56. Character ch = S.charAt(i);
  57. if (map.keySet().contains(ch)) {
  58. map.put(ch, map.get(ch) - 1);
  59. if (map.get(ch) >= 0) {
  60. count ++;
  61. }
  62. // 如果找到一个子串
  63. while (count == T.length()) {
  64. if (i - left + 1 < minLen) {
  65. minLen = i - left + 1;
  66. minStart = left;
  67. }
  68. if (map.keySet().contains(S.charAt(left))) {
  69. // 如果右移的时候遇到了T中的字符,将hash表中对应字符加1,因为在后面要查找该字符
  70. map.put(S.charAt(left), map.get(S.charAt(left)) + 1);
  71. if (map.get(S.charAt(left)) > 0) {
  72. // 如果加1之后小于1,说明之前是负数,说明现在窗口内还有多个T中的字符,需要继续向前移动窗口
  73. // 如果大于1才停止向前移动窗口
  74. count--;
  75. }
  76. }
  77. left ++;
  78. }
  79. }
  80. }
  81. if (minLen > S.length()) {
  82. return "";
  83. }
  84. return S.substring(minStart, minLen + minStart);
  85. }
  86. public static void main(String[] args) {
  87. MinimumWindowSubstring minimumWindowSubstring = new MinimumWindowSubstring();
  88. System.out.println(minimumWindowSubstring.findMinimumWindowSubString("ADOBECODEBANC", "ABC"));
  89. }
  90. }

leetcode — minimum-window-substring的更多相关文章

  1. [LeetCode] 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]Minimum Window Substring @ Python

    原题地址:https://oj.leetcode.com/problems/minimum-window-substring/ 题意: Given a string S and a string T, ...

  3. [LeetCode] Minimum Window Substring 散列映射问题

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

  4. Leetcode Minimum Window Substring

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

  5. [Leetcode] minimum window substring 最小字符窗口

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

  6. LeetCode()Minimum Window Substring 超时,但觉得很清晰。

    我的超时思路,感觉自己上了一个新的台阶,虽然超时了,但起码是给出了一个方法. 遍历s 一遍即可,两个指针,当找到了一个合格的字串后,start 开始走,直到遇到s[start]在t中 如果不符合,en ...

  7. Minimum Window Substring @LeetCode

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

  8. LeetCode解题报告—— Minimum Window Substring && Largest Rectangle in Histogram

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

  9. 【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 ...

  10. 53. Minimum Window Substring

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

随机推荐

  1. 在n个数字中求为k的和————Java

    给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K.如果可以,输出:"YES",否则输出"NO".用Java实现 import java.util ...

  2. Meanshift均值漂移算法

      通俗理解Meanshift均值漂移算法  Meanshift车手?? 漂移?? 秋名山???   不,不,他是一组算法,  今天我就带大家来了解一下机器学习中的Meanshift均值漂移. Mea ...

  3. c语言构建哈希表

    /*哈希查找 *哈希函数的构造方法常用的有5种.分别是: *数字分析法 *平方取中法 *分段叠加 *伪随机数 *除留取余法 *这里面除留取余法比较常用 *避免哈希冲突常用的方法有4种: *开放定址法( ...

  4. HTML基本格式和文本元素(标签)介绍

    <!doctype html>//声明文档类型 <html lang="zh-cn">//文档开始,后面是声明是中文页面的意思,en是英语的意思 <h ...

  5. Java学习之JDBC 2019/3/10

    Java学习之JDBC 大部分的程序都是用来通过处理数据来达到人们预期的效果,数据是粮食,没有数据操作的程序就像helloworld程序一样没有用处.因此数据库操作是重中之重,是程序发挥功能的基石,j ...

  6. 传统对象池&AB对象池

    前序: Q:为啥需要对象池? A: 游戏中大量出现或销毁对象时会反复的开堆和放堆,程序与内存之间交互过于频繁导致资源的大量浪费 Q: 对象池实现原理? A: 当子对象池没有物体的时候,它会和普通没加对 ...

  7. java0618

    1. java的基本数据类型,各占多少字节? byte 8位 short 16位 int 32位 long 64位 float 32位 double 64位 boolean 1位 char 16位 2 ...

  8. 使用sklearn估计器构建K-Means聚类模型

    实例要求:以sklearn库自带的iris数据集为例,使用sklearn估计器构建K-Means聚类模型,并且完成预测类别功能以及聚类结果可视化. 实例代码: import pandas as pd ...

  9. Hive数仓之快速入门(二)

    上次已经讲了<Hive数据仓库之快速入门一>不记得的小伙伴可以点击回顾一下,接下来我们再讲Hive数据仓库之快速入门二 DQL hive中的order by.distribute by.s ...

  10. 微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)

    1.点评 对于IM系统来说,如何做到IM聊天消息离线差异拉取(差异拉取是为了节省流量).消息多端同步.消息顺序保证等,是典型的IM技术难点. 就像即时通讯网整理的以下IM开发干货系列一样: <I ...