• LeetCode: Minimum Window Substring


     1 /**
     2  * 
     3  */
     4 package solution;
     5 
     6 import java.util.HashMap;
     7 
     8 /**
     9  * @author whh
    10  * 
    11  *         Given a string S and a string T, find the minimum window in S which
    12  *         will contain all the characters in T in complexity O(n).
    13  * 
    14  *         For example, S = "ADOBECODEBANC", T = "ABC" Minimum window is "BANC".
    15  * 
    16  *         Note:
    17  * 
    18  *         If there is no such window in S that covers all characters in T,
    19  *         return the emtpy string "". If there are multiple such windows, you
    20  *         are guaranteed that there will always be only one unique minimum
    21  *         window in S.
    22  */
    23 public class MinimumWindowSubstring {
    24 
    25     /**
    26      * @param args
    27      */
    28     public static void main(String[] args) {
    29         MinimumWindowSubstring mws = new MinimumWindowSubstring();
    30         String S = "aabbDEE", T = "aabbDEE";
    31         System.out.println(mws.minWindow(S, T));
    32     }
    33 
    34     /**
    35      * @param S
    36      * @param T
    37      * @return
    38      */
    39     public String minWindow(String S, String T) {
    40 
    41         HashMap<Character, Integer> hasFound = new HashMap<Character, Integer>();
    42         HashMap<Character, Integer> needToFind = new HashMap<Character, Integer>();
    43 
    44         for (int i = 0; i < T.length(); i++) {
    45             hasFound.put(T.charAt(i), 0);
    46 
    47             if (needToFind.containsKey(T.charAt(i))) {
    48                 needToFind.put(T.charAt(i), needToFind.get(T.charAt(i)) + 1);
    49             } else {
    50                 needToFind.put(T.charAt(i), 1);
    51             }
    52         }
    53 
    54         int begin = 0;
    55         int minWindowSize = S.length();
    56         String retString = "";
    57 
    58         int count = 0;
    59 
    60         for (int end = 0; end < S.length(); end++) {
    61             Character end_c = S.charAt(end);
    62             if (needToFind.containsKey(end_c)) {
    63                 hasFound.put(end_c, hasFound.get(end_c) + 1);
    64                 if (hasFound.get(end_c) <= needToFind.get(end_c)) {
    65                     count++;
    66                 }
    67                 if (count == T.length()) {
    68                     while ((!needToFind.containsKey(S.charAt(begin)))
    69                             || (hasFound.get(S.charAt(begin)) > needToFind
    70                                     .get(S.charAt(begin)))) {
    71 
    72                         if (needToFind.containsKey(S.charAt(begin))) {
    73                             hasFound.put(S.charAt(begin),
    74                                     hasFound.get(S.charAt(begin)) - 1);
    75                         }
    76 
    77                         begin++;
    78                     }
    79 
    80                     if ((end - begin + 1) <= minWindowSize) {
    81                         minWindowSize = end - begin + 1;
    82                         retString = S.substring(begin, end + 1);
    83                     }
    84                 }
    85             }
    86         }
    87 
    88         return retString;
    89     }
    90 
    91 }
  • 相关阅读:
    使用积分图像统计元素
    compareHist
    均值平移算法
    课后作业-阅读任务-阅读提问-1
    《对软件工程课程的期望》
    自我介绍
    作业
    结对-结对编项目作业名称-需求分析
    对软件工程课程的期望
    自我介绍
  • 原文地址:https://www.cnblogs.com/Jellylovecode/p/MinimumWindowSubstring.html
Copyright © 2020-2023  润新知