LeetCode--76--hard--MinimumWindowSubstring

package com.app.main.LeetCode.slidingwindow;


import java.util.HashMap;
import java.util.Map;

/**
 *
 * 76
 *
 * hard
 *
 * https://leetcode.com/problems/minimum-window-substring/
 *
 * 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).
 *
 * Example:
 *
 * Input: S = "ADOBECODEBANC", T = "ABC"
 * Output: "BANC"
 * Note:
 *
 * If there is no such window in S that covers all characters in T, return the empty string "".
 * If there is such window, you are guaranteed that there will always be only one unique minimum window in S.
 *
 *
 * Created with IDEA
 * author:Dingsheng Huang
 * Date:2020/1/19
 * Time:下午3:55
 */
public class MinimumWindowSubstring {

    //"ab"
    //"a"

    //"ab"
    //"b"

    //"bba"
    //"ab"
    public String minWindow(String s, String t) {
        if (t.length() == 0 || s.length() == 0 || s.length() < t.length()) {
            return "";
        }
        Map<Character, Integer> count = new HashMap<>();
        Map<Character, Integer> tCount = new HashMap<>();
        for (int i = 0; i < t.length(); i++) {
            if (tCount.containsKey(t.charAt(i))) {
                tCount.put(t.charAt(i), 1 + tCount.get(t.charAt(i)));
            } else {
                tCount.put(t.charAt(i), 1);
            }
        }
        int min = s.length();
        int start = 0;
        int end = s.length() - 1;
        int l = 0;
        int cn = t.length();

        for (int r = 0; r < s.length(); r++) {
            if (cn == 0) {
                if (count.containsKey(s.charAt(r))) {
                    count.put(s.charAt(r), 1 + count.get(s.charAt(r)));
                }
                while (!count.containsKey(s.charAt(l)) || (count.containsKey(s.charAt(l)) && count.get(s.charAt(l)) > tCount.get(s.charAt(l)))) {
                    if (count.containsKey(s.charAt(l))) {
                        count.put(s.charAt(l), count.get(s.charAt(l)) - 1);
                    }
                    l++;
                }
                if (r - l + 1 < min) {
                    min = r - l + 1;
                    start = l;
                    end = r;
                }
            } else {
                if (tCount.containsKey(s.charAt(r))) {
                    if (count.containsKey(s.charAt(r))) {
                        if (count.get(s.charAt(r)) < tCount.get(s.charAt(r))) {
                            cn--;
                            count.put(s.charAt(r), 1 + count.get(s.charAt(r)));
                        } else {
                            count.put(s.charAt(r), 1 + count.get(s.charAt(r)));
                        }
                    } else {
                        count.put(s.charAt(r), 1);
                        cn--;
                    }
                }
                if (cn == 0 && r == s.length() - 1) {
                    while (!count.containsKey(s.charAt(l)) || (count.containsKey(s.charAt(l)) && count.get(s.charAt(l)) > tCount.get(s.charAt(l)))) {
                        if (count.containsKey(s.charAt(l))) {
                            count.put(s.charAt(l), count.get(s.charAt(l)) - 1);
                        }
                        l++;
                    }
                    if (r - l + 1 < min) {
                        min = r - l + 1;
                        start = l;
                        end = r;
                    }
                }
            }
        }

        if (cn > 0) {
            return "";
        }

        // update count
        Map<Character, Integer> count2 = new HashMap<>();
        for (int i = start; i <= end; i++) {
            if (count2.containsKey(s.charAt(i))) {
                count2.put(s.charAt(i), 1 + count2.get(s.charAt(i)));
            } else {
                count2.put(s.charAt(i), 1);
            }
        }

        //"ab"
        //"a"
        while (!tCount.containsKey(s.charAt(end)) || (count2.containsKey(s.charAt(end)) && (count2.get(s.charAt(end)) > tCount.get(s.charAt(end))))) {
            if (tCount.containsKey(s.charAt(end))) {
                count2.put(s.charAt(end), count2.get(s.charAt(end)) - 1);
            }
            end--;
        }

        return s.substring(start, end + 1);

    }

    //"ask_not_what_your_country_can_do_for_you_ask_what_you_can_do_for_your_country"
    //"ask_country"
    //Output
    //"sk_not_what_your_co"
    //Expected
    //"sk_not_what_your_c"

}
发布了187 篇原创文章 · 获赞 26 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/huangdingsheng/article/details/104306079
今日推荐