塞尔达是天
← 返回所有文章

滑动窗口

2026年4月27日

  • Markdown
  • 样式

滑动窗口

3. 无重复字符的最长子串

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n=s.length();
        Map<Character,Integer>map=new HashMap<>();
        int left=0;
        int maxLen=0;
        int curLen=0;
        for(int right=0;right<n;right++){
            if(map.containsKey(s.charAt(right))){
                while(s.charAt(left)!=s.charAt(right)){
                    map.remove(s.charAt(left));
                    left++;
                    curLen--;
                }
                left++;
            }else{
                map.put(s.charAt(right),right);
                curLen++;
                maxLen=Math.max(curLen,maxLen);
            }
        }
        return maxLen;
    }
}
  • 集合泛型必须用包装类,如 Character,不能用 char
  • 数组长度:length 属性;字符串长度:length () 方法
  • 字符串取字符用 charAt (),不可用 [] 访问
  • Map 判断键存在用 containsKey (),删除用 remove ()
  • Map.put (key,value) 键重复会覆盖旧值
  • 可以不一个个remove,判断left是否大于map映射的位置

438. 找到字符串中所有字母异位词

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer>ans=new ArrayList<>();
        int lenS=s.length();
        int lenP=p.length();
        if(lenS<lenP)return ans;

        int []pArr=new int[26];
        int []sArr=new int[26];
        for(int i=0;i<lenP;i++){
            pArr[p.charAt(i)-'a']++;
            sArr[s.charAt(i)-'a']++;
        }
        if(countEquel(pArr,sArr))ans.add(0);
        for(int i=0;i<lenS-lenP;i++){//滑动窗口的次数
            sArr[s.charAt(i)-'a']--;
            sArr[s.charAt(i+lenP)-'a']++;
            if(countEquel(pArr,sArr))ans.add(i+1);
        }
        return ans;
    }
    private boolean countEquel(int[]arr1,int[]arr2){
        for(int i=0;i<24;i++){
            if(arr1[i]!=arr2[i])return false;
        }
        return true;
    }
}
  • 26 位数组代替哈希表
  • 数组定义语法,int []sArr=new int[26];
  • 字符串直接下标访问必须用 charAt(i)