leetcode 76 最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

 

注意:

对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-window-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

 

class Solution {
    public String minWindow(String s, String t) {
        if (s.length() < t.length() || s.length() == 0 || s == null) {
            return "";
        }
        Map<Character, Integer> t_map = new HashMap<>();
        for (int i = 0; i < t.length(); i++) {
            t_map.put(t.charAt(i), t_map.getOrDefault(t.charAt(i), 0) + 1);
        }
        Map<Character, Integer> s_map = new HashMap<>();
        // 满足条件的字符串
        int valid = 0;
        // 左右指针
        int left = 0, right = 0;
        // 记录最小的窗口
        int min_len = Integer.MAX_VALUE, min_left = 0;
        while (right < s.length()) {
            char ch = s.charAt(right);
            // 扩大右边界
            right++;
            s_map.put(ch, s_map.getOrDefault(ch, 0) + 1);
            if (s_map.get(ch).equals(t_map.get(ch))) {
                valid++;
            }
            // 当满足条件的时候,需要缩小窗口,增大左指针
            while (valid == t_map.size()) {
                if (right - left < min_len) {
                    min_len = right - left;
                    min_left = left;
                }
                char c = s.charAt(left);
                if (s_map.get(c).equals(t_map.get(c))) {
                    valid--;
                }
                s_map.put(c, s_map.get(c) - 1);
                left++;
            }
        }
        return min_len == Integer.MAX_VALUE ? "" : s.substring(min_left, min_len + min_left);
    }
}

 

posted @   牵魂  阅读(20)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示