LeetCode-438-找到字符串中所有字母异位词
思路
使用滑动窗口来解决,用哈希表定义两个容器,一个是目标容器,一个是窗口容器,然后通过滑动窗口来找出符合要求的索引
代码
class Solution {
public List<Integer> findAnagrams(String s, String p) {
Map<Character,Integer> need=new HashMap<>();//目标容器
Map<Character,Integer> win=new HashMap<>();//窗口容器
//初始化目标容器
for(int i=0;i<p.length();i++){
char tmp=p.charAt(i);
need.put(tmp,need.getOrDefault(tmp,0)+1);
}
int left=0,right=0;
int cnt=0;
List<Integer> res=new ArrayList<>();
while(right<s.length()){
char r=s.charAt(right);
right++;//扩大
if(need.containsKey(r)){
win.put(r,win.getOrDefault(r,0)+1);
if(win.get(r).equals(need.get(r))) cnt++;
}
while(cnt==need.size()){
if(right - left == p.length()){
res.add(left);
}
char l = s.charAt(left);
left++;//缩小
// 判断和缩小滑窗边界
if(need.containsKey(l)){
if(need.get(l).equals(win.get(l))) cnt--;
win.put(l,win.get(l)-1);
}
}
}
return res;
}
}