滑动窗口练习题笔记

 参考大佬总结

438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

最小覆盖字串

76. 最小覆盖子串 - 力扣(LeetCode)

class Solution {
    public String minWindow(String S, String t) {
     Map<Character,Integer> need=new HashMap<>();
     Map<Character,Integer> window=new HashMap<>();

     for(char tt:t.toCharArray()){
        need.put(tt,need.getOrDefault(tt,0)+1);
     }
     
int left=0,right=0;
int valid=0;
int first=0,len=Integer.MAX_VALUE;
while(right<S.length()){
    char a=S.charAt(right);
    right++;

   window.put(a,window.getOrDefault(a,0)+1);
   if(window.get(a).equals(need.get(a))){
          valid++;
   }

   while(valid==need.size()){
  
   if(right-left<len){
      first=left;
      len=right-left;
   }
   
   char b=S.charAt(left);
   left++;

   if(window.get(b).equals(need.get(b))){
    valid--;
   }
   window.put(b,window.get(b)-1);
 }




}

return len==Integer.MAX_VALUE?"":S.substring(first,first+len);

}
}

字符串的排列

567. 字符串的排列 - 力扣(LeetCode)

class Solution {
    public boolean checkInclusion(String s1, String s2) {
       Map<Character,Integer> need=new HashMap<>();
       Map<Character,Integer> window=new HashMap<>();

       for(char s:s1.toCharArray()){
        need.put(s,need.getOrDefault(s,0)+1);
       }

int left=0,right=0;
int valid=0;
int start=0,len=Integer.MAX_VALUE;

while(right<s2.length()){
    char a=s2.charAt(right);
    right++;

    window.put(a,window.getOrDefault(a,0)+1);
    if(window.get(a).equals(need.get(a))){
        valid++;
    }

    while(valid==need.size()){
        if(right-left<len){
            start=left;
            len=right-left;
        }

    char b=s2.charAt(left);
    left++;

    if(window.get(b).equals(need.get(b))){
        valid--;
    }
    window.put(b,window.get(b)-1);

    }
}

if(len==Integer.MAX_VALUE){
    return false;
}

if(len==s1.length()){
    return true;
}else{
    return false;
}


    }
}

找到字符串所有字母异位词

438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        Map<Character, Integer> need = new HashMap<>();
        Map<Character, Integer> window = new HashMap<>();
       List<Integer> res=new ArrayList<>();

    for(char pp:p.toCharArray()){
        need.put(pp,need.getOrDefault(pp,0)+1);
    }

    int left=0,right=0;
    int valid=0;
    
    while(right<s.length()){
        char a=s.charAt(right);
        right++;

        window.put(a,window.getOrDefault(a,0)+1);
        if(window.get(a).equals(need.get(a))){
            valid++;
        }

        while(valid==need.size()){
            
        if(right-left==p.length()){
        res.add(left);
        }

         char b=s.charAt(left);
         left++;

         if(window.get(b).equals(need.get(b))){
            valid--;
         }
         window.put(b,window.get(b)-1);



        }
    }
    return res;
    }
}
 

无重复字符的最长子串 

3. 无重复字符的最长子串 - 力扣(LeetCode)

class Solution {
    public int lengthOfLongestSubstring(String s) {
    
     Map<Character, Integer> window = new HashMap<>();
    int res=0;

    int left=0,right=0;
    while(right<s.length()){
        char a=s.charAt(right);
        right++;

        window.put(a,window.getOrDefault(a,0)+1);

        while(window.get(a)>1){
           char b=s.charAt(left);
           left++;

           window.put(b,window.getOrDefault(b,0)-1);
        }
      
      res=Math.max(res,right-left);

    }

return res;

    }
}

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值