【274、leetcode76:最小覆盖子串】

79 阅读1分钟

leetcode76 题目描述:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出包含 T 所有字母的最小子串。

Java 代码实现:

public String minWindow(String s, String t) {
    int[] map = new int[128];
    for (char c : t.toCharArray()) {
        map[c]++;
    }
    int start = 0, end = 0, minStart = 0, minLen = Integer.MAX_VALUE, counter = t.length();
    while (end < s.length()) {
        char c1 = s.charAt(end);
        if (map[c1] > 0) {
            counter--;
        }
        map[c1]--;
        end++;
        while (counter == 0) {
            if (end - start < minLen) {
                minStart = start;
                minLen = end - start;
            }
            char c2 = s.charAt(start);
            map[c2]++;
            if (map[c2] > 0) {
                counter++;
            }
            start++;
        }
    }
    return minLen == Integer.MAX_VALUE ? "" : s.substring(minStart, minStart + minLen);
}

这个算法的时间复杂度为 O(n),其中 n 是字符串 S 的长度。算法的基本思路是使用双指针滑动窗口,遍历字符串 S,并记录每个字符出现的次数。用 counter 记录字符串 T 中的字符数,然后移动右指针,遇到字符串 T 中的字符时将 counter 减 1,并将字符出现的次数减 1。当 counter 减为 0 时,表示找到了包含字符串 T 所有字符的一个子串,此时记录子串的长度和起始位置,并移动左指针直到不满足条件,同时更新记录的子串长度和起始位置。重复上述过程直到遍历完字符串 S。