76. 最小覆盖子串(leetcode)

https://leetcode.cn/problems/minimum-window-substring/description/

难点在于解决字符出现次数的计算以及如何理解[涵盖],如何判断是否涵盖

class Solution {
    public String minWindow(String S, String t) {
        // 涵盖:s子串中每个字母出现的次数都大于等于t每个字母出现的次数
        String res="";
        int resLeft=-1;
        int resRight=S.length();
        char[] s=S.toCharArray();
        int[] cntS = new int[128]; // s 子串字母的出现次数
        int[] cntT = new int[128]; // t 中字母的出现次数
        for(char c:t.toCharArray())cntT[c]++;
        for(int i=0,j=0;i<s.length;i++)
        {
            cntS[s[i]]++; // 新加入字符
            while(check(cntS,cntT)) // 判断是否涵盖
            {
                if(resRight-resLeft > i-j) // 更新答案
                {
                    resRight=i;
                    resLeft=j;
                }
                // 移动左指针缩小
                cntS[s[j]]--;
                j++;
            }
        }
        return resLeft < 0 ? "" : S.substring(resLeft,resRight+1);
    }

    // 传入s的子串,和t,判断是否涵盖
    boolean check(int[] cntS,int[] cntT)
    {
        for(int i='A';i<='z';i++)
            if(cntS[i] < cntT[i]) return false;
        // for(int i='a';i<='z';i++)
        //     if(cntS[i] < cntT[i]) return false;
        return true;
    }   
}

 

posted @ 2024-10-06 02:43  风乐  阅读(14)  评论(0)    收藏  举报