LeetCode76 最小覆盖子串


滑动窗口+map

设定左右双指针,若滑动窗口内不包含t中所有的字符则右指针右移,若包含t所有字符则左指针右移同时更新最小值和对应边界直到不包含所有的,以此循环直到s的最后

  • 时间复杂度:O(C*m+n),m为s的长度
  • 空间复杂度:O(C),C为t的长度
class Solution {
    Map need = new HashMap<>();
    Map have = new HashMap<>();
    public String minWindow(String s, String t) {
        int sLen = s.length(),tLen = t.length();
        for(int i=0;ir-l+1){
                    min = r-l+1;
                    ansL = l;
                    ansR = r;
                }
                char cl = s.charAt(l);
                have.put(cl,have.getOrDefault(cl,0)-1);
                l++;
            }
        }
        return ansL==-1?"":s.substring(ansL,ansR);
    }
    private boolean check(){
        for(char c:need.keySet()){
            int count = have.getOrDefault(c,0);
            if(count

滑动窗口+数组

滑动窗口采用map保存字符和个数,可用数组代替map优化空间复杂度

  • 时间复杂度:O(C*m+n)
  • 空间复杂度:O(C)
class Solution {
    public String minWindow(String s, String t) {
        int sLen = s.length(),tLen = t.length();
        int[] need = new int[128] , have = new int[128];
        int l = 0,r = 0,length = 0;
        int ansL = -1,ansR = -1,min = Integer.MAX_VALUE;
        for(int i=0;ir-l+1){
                    min = r-l+1;
                    ansL = l;
                    ansR = r;
                }
                char cl = s.charAt(l);
                have[cl]--;
                l++;
                if(have[cl]