76 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.


双指针,动态维护一个区间。尾指针不断往后扫,当扫到有一个窗口包含了所有 T 的字符后,然后再收缩头指针,直到不能再收缩为止。最后记录所有可能的情况中窗口最小的

class Solution {
    public String minWindow(String s, String t) {
        if (s.isEmpty()) {
            return "";
        }
        
        if (s.length() < t.length()) {
            return "";
        }
        final int ASCII = 256;
        int[] expect_count = new int[ASCII];
        int[] appear_count = new int[ASCII];
        Arrays.fill(expect_count, 0);
        Arrays.fill(appear_count, 0);
        
        int appear = 0, wnd_start = 0, min_width = Integer.MAX_VALUE;
        int min_start = 0;
        
        for (int i = 0; i < t.length(); i++) {
            expect_count[t.charAt(i)]++;
        }
        
        for (int wnd_end = 0; wnd_end < s.length(); wnd_end++) {
            if (expect_count[s.charAt(wnd_end)] > 0) {
                appear_count[s.charAt(wnd_end)]++;
                if (appear_count[s.charAt(wnd_end)] <= 
                   expect_count[s.charAt(wnd_end)]) {
                    appear++;
                }
            }
            
            if (appear == t.length()) {
                while (appear_count[s.charAt(wnd_start)] > 
                      expect_count[s.charAt(wnd_start)] || 
                       expect_count[s.charAt(wnd_start)] == 0) {
                    appear_count[s.charAt(wnd_start)]--;
                    wnd_start++;
                }
                if (min_width > wnd_end - wnd_start + 1) {
                    min_width = wnd_end - wnd_start + 1;
                    min_start = wnd_start;
                }
            }
        }
        if (min_width == Integer.MAX_VALUE) {
            return "";
        } else {
            return s.substring(min_start, min_start + min_width);
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值