leedcode_滑动窗口

📅 发布时间:2026/9/16 9:06:11
leedcode_滑动窗口
1.无重复最长子串class Solution { public int lengthOfLongestSubstring(String s) { //定义左右指针和键值对存最后出现位置作为滑动窗口依据 int left 0; int maxlen 0; int right 0; MapCharacter,Integer lastIndex new HashMap(); //循环操作 for(;right s.length();right){ char c s.charAt(right); if(lastIndex.containsKey(c) lastIndex.get(c) left){ left lastIndex.get(c) 1; } //更新位置和计算长度 lastIndex.put(c,right); maxlen Math.max(maxlen,right - left 1); } return maxlen; } }lastIndex.get(c) left不可缺少的原因lastIndex这个 map从头到尾都在记录每个字符最后出现的位置它不会主动删除过期的数据。所以会出现这种情况某个字符很久以前出现过但现在早就被踢出窗口了map 里还傻傻地记着它的旧位置。如果你不加 left程序就会拿这个过期的旧位置来判断是否重复结果就是误判。2.找到字符串所有字母异位词首先固定滑动窗口长度和2个字符长度并排除边界然后就是用数组分别记录滑动窗口 和 p字符出现次数接着为初始化做准备先初始化p的出现情况然后开始滑动窗口1.先右端进来2.超出p窗口就移除最左端3.窗口刚刚好就比较并且记录开始下标class Solution { public ListInteger findAnagrams(String s, String p) { //定义返回数组s和p的长度 ListInteger result new ArrayList(); int slen s.length(); int plen p.length(); //排除边界 if(slen plen){ return result; } //分别统计s和p的字符,采用字符串与a相减得到数字的范围是0-26的数组存储 //两个计数数组分别记录窗口和 p 的字符出现次数 int[] scount new int[26]; int[] pcount new int[26]; //初始化标记 p 的字符 for(int i 0;i plen;i){ pcount[p.charAt(i) -a]; } //滑动窗口i 是窗口右端窗口长度为 plen for(int i 0;i slen;i){ //右端字新符进来 scount[s.charAt(i) - a]; //因为是从0开始所以是 //当窗口长度超过 pLen 时左边旧字符出去 if(i plen){ scount[s.charAt(i - plen) - a]--; } //窗口已满长度达到 plen开始比较 if(i plen - 1){ if(Arrays.equals(scount,pcount)){ result.add(i - plen 1); } } } return result; } }