剑指 Offer II 017. 含有所有字符的最短字符串(困难 哈希表 字符串 滑动窗口)

剑指 Offer II 017. 含有所有字符的最短字符串

给定两个字符串 s 和 t 。返回 s 中包含 t 的所有字符的最短子字符串。如果 s 中不存在符合条件的子字符串,则返回空字符串 “” 。

如果 s 中存在多个符合条件的子字符串,返回任意一个。

注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。

示例 1:

输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”
解释:最短子字符串 “BANC” 包含了字符串 t 的所有字符 ‘A’、‘B’、‘C’
示例 2:

输入:s = “a”, t = “a”
输出:“a”
示例 3:

输入:s = “a”, t = “aa”
输出:""
解释:t 中两个字符 ‘a’ 均应包含在 s 的子串中,因此没有符合条件的子字符串,返回空字符串。

提示:

1 <= s.length, t.length <= 105
s 和 t 由英文字母组成

进阶:你能设计一个在 o(n) 时间内解决此问题的算法吗?

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

分析

1、创建key为Character,value为Integer类型的哈希表,遍历存储t字符串中的字符和对应出现次数。
2、用count变量表示子字符串是否已经包含t字符串中所有字符,初始时赋值为哈希表的大小。
3、当遍历s字符串时,如果count不为0,右指针遇到t中有的字符便把哈希表中对应字符的value减一,当value减为0,令count减一,表示子字符串中已经包含了t中所有该字符,操作完成后右指针右移。
4、如果count为0,储存子字符串的最小长度,左指针遇到t中有的字符便把哈希表中对应字符的value加一,当value为1,令count加一,表示左指针右移后子字符串中未包含t中所有该字符,操作完成后左指针右移。

题解(Java)

class Solution {
    public String minWindow(String s, String t) {
        int minLength = Integer.MAX_VALUE, start = 0, end = 0, minStart = 0, minEnd = 0;
        Map map = new HashMap<>();
        for (int i = 0; i < t.length(); i++) {
            map.put(t.charAt(i), map.getOrDefault(t.charAt(i), 0) + 1);
        }
        int count = map.size();
        while (end < s.length() || (count == 0 && end == s.length())) {
            if (count > 0) {
                char endCh = s.charAt(end);
                if (map.containsKey(endCh)) {
                    map.put(endCh, map.get(endCh) - 1);
                    if (map.get(endCh) == 0) count--;
                }
                end++;
            } else {
                if (end - start < minLength) {
                    minLength = end - start;
                    minStart = start;
                    minEnd = end;
                }
                char startCh = s.charAt(start);
                if (map.containsKey(startCh)) {
                    map.put(startCh, map.get(startCh) + 1);
                    if (map.get(startCh) == 1) count++;
                }
                start++;
            }
        }
        return minLength < Integer.MAX_VALUE ? s.substring(minStart, minEnd) : "";
    }
}

你可能感兴趣的:(散列表,数据结构,leetcode)