滑动窗口
2026年4月27日
- Markdown
- 样式
滑动窗口
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映射的位置
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)