76. Minimum Window Substring

一、题目

  1、审题

  

  2、分析

    给出两个字符串 s 与 t,求 t 中所有字符在 s 中都出现的最短长度的 s 的一个子串。若 s 中不存在这样的子串,返回空。

二、解答

  1、思路:

    ①、用 HashMap 存储 t 的字符,其中 key 为 字符, value 为出现的次数。

    ②、遍历 s 中的字符,并判断是否是 t 中的待匹配的字符,

        若是,则记录匹配的字符的变量 count++;同时,map 中的对应的 --value;

        若不是,继续遍历。

    ③、若 count == t.length(),则此时找到 s 的一个匹配的子串。

        判断该子串是否长度更小,若是,则进行下标的记录。

        指向该子串左端的指针开始右移动,同时 Map中的 value 进行更改,并且 count--;

    ④、遍历完成后,输出。

public String minWindow(String s, String t) {
    
        int len1 = s.length();
        int len2 = t.length();
        
        if(len1 == 0 || len2 == 0 || len1 < len2)
            return "";
        
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        for(char c: t.toCharArray())
            if(map.containsKey(c))
                map.put(c, map.get(c) + 1);
            else
                map.put(c, 1);
        
        
        int left = 0;    // 当前查找的子串的开始
        int minLeft = 0;    // 总的最小子串的开始
        int minLen = len1 + 1;    // 记录最小子串的长度
        int count = 0;    // t 中匹配的字符的个数
        for(int right = 0; right < s.length(); right++) {
            char c = s.charAt(right);
            Integer value = map.get(c);
            if(map.containsKey(c)) {
                map.put(c, --value);
                if(value >= 0) 
                    count++;
            }
            
            // 还原 Map 值
            while(count == len2) {

                if(right - left + 1 < minLen) {    // 这个串更小
                    minLeft = left;
                    minLen = right - left + 1;
                }
                c = s.charAt(left);
                if(map.containsKey(c)) {
                    value = map.get(c);
                    map.put(c, ++value);
                    if(value > 0)
                        count--;
                }
                left++;    // 
            }
        }
        
        if(minLen > len1)
            return "";
        
        return s.substring(minLeft, minLeft + minLen);
    }
原文地址:https://www.cnblogs.com/skillking/p/9691483.html