LeetCode76. 最小覆盖子串

一、题目描述

☆☆☆☆二、解法

思路:滑动窗口。 时间复杂度O(n)

LeetCode438. 找到字符串中所有字母异位词属于同一类型的题,滑动窗口的套路就是  扩张->满足条件->收缩

class Solution {
    public String minWindow(String s, String t) {
        if (s == null || s.length() < t.length()) return "";
        int[] dict = new int[128]; // ASCII表总长128
        int[] cur = new int[128];
        int l = 0, r = 0;
        int count = 0;
        int start = 0, minLen = s.length() + 1;
        for (char c : t.toCharArray()) {
            dict[c] ++;
        }
        while (r < s.length()) {
            char c = s.charAt(r);
            cur[c] ++;
            if (cur[c] <= dict[c]) { // 关键点1
                count ++;
            }
            while (count == t.length()) { // 左指针收缩
                if (r - l + 1 < minLen) {
                    minLen = r - l + 1;
                    start = l;
                }
                cur[s.charAt(l)] --;
                if (cur[s.charAt(l)] < dict[s.charAt(l)]) { // 关键点2
                    count --;
                }
                l ++;
            }
            r ++;
        }
        return minLen > s.length() ? "" : s.substring(start, start + minLen);
    }
}

 

posted @ 2020-12-08 10:51  不学无墅_NKer  阅读(94)  评论(0编辑  收藏  举报