之前说过滑动窗口的套路,这里直接说题解了。
题目的意思就是在s中找的p的一些排列,并返回起始索引。
- 直接创建一个滑动窗口哈希表,一个子字符串哈希表
- 这里的count是用来判断p_map的映射关系的,当某一个字符满足了p_map的需求的时候,count++,对应的代码是
if(window_map.get(c).equals(p_map.get(c))){ count++; }
也是为后面的判断做铺垫
- 进入后面的while循环right-left==p.length()来判断窗口的长度
- if(count==p_map.size())说明映射关系满足了,这一组数据是匹配的索引加进去,此时要干什么?滑动窗口第三步是优化或者去找下一组可行解,在这里就是找可行解嘛。
- 还有一个需要注意的地方,对于滑动窗口在本题中来说,刚开始向右往window中加k-v的时候一定是先加进去,然后判断单个字符是否满足条件进行count++操作,而变动左指针改变k-v的时候,一定是先判断然后count--之后,再去更新k-v
class Solution {
public List<Integer> findAnagrams(String s, String p) {
HashMap<Character,Integer> window_map=new HashMap<>();
HashMap<Character,Integer> p_map=new HashMap<>();
for(int i=0;i<p.length();i++){
char c1=p.charAt(i);
p_map.put(c1,p_map.getOrDefault(c1,0)+1);
}
int left=0,right=0,count=0;
List<Integer> res=new ArrayList<>();
while(right<s.length()){
char c=s.charAt(right);
right++;
if(p_map.containsKey(c)){
window_map.put(c,window_map.getOrDefault(c,0)+1);
if(window_map.get(c).equals(p_map.get(c))){
count++;
}
}
while(right-left==p.length()){
if(count==p_map.size()){
res.add(left);
}
char d=s.charAt(left);
left++;
if(p_map.containsKey(d)){
if(window_map.get(d).equals(p_map.get(d))){
count--;
}
window_map.put(d,window_map.getOrDefault(d,0)-1);
}
}
}
return res;
}
}