76-最小窗口子串

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LaputaFallen/article/details/79949775

Description:

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


For example,

S = "ADOBECODEBANC"
T = "ABC"

Minimum window is “BANC”.


Note:

If there is no such window in S that covers all characters in T, return the empty string “”.

If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.


问题描述
给定字符串S和T,在O(n)的时间复杂度下找出S中包含T所有字符的最小窗口。
例如,S = “ADOBECODEBANC”, T = “ABC”, 返回”BANC”


问题分析
注意题目要求是包含所有字符就可以了,不需要注意顺序
这种题下面这个链接总结的模板非常好,建议看一下:
https://leetcode.com/problems/minimum-window-substring/discuss/26808/Here-is-a-10-line-template-that-can-solve-most-‘substring’-problems


解法

class Solution {
    public String minWindow(String s, String t) {
        int[] map = new int[128];

        for(char c : t.toCharArray())  map[c]++;

        int counter = t.length(), start = 0, end = 0, d = Integer.MAX_VALUE, minstart = 0;

        while(end < s.length()){
            char c = s.charAt(end);
            if(map[c] > 0)  counter--;
            map[c]--;
            end++;
            while(counter == 0){
                if(end - start < d){
                    d = end - start;
                    minstart = start;
                }
                char c1 = s.charAt(start);
                if(map[c1] == 0)    counter++;
                map[c1]++;
                start++;
            }
        }

        return d == Integer.MAX_VALUE ? "" : s.substring(minstart, minstart + d);
    }
}

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭