解法
package com.wangxiaohu;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class LeetCode438 {
public static void main(String[] args) {
String s = "cbaebabacd";
String p = "abc";
System.out.println(findAnagrams(s, p));
}
public static List<Integer> findAnagrams(String s, String p) {
Map<Character, Integer> need = new HashMap<>();
Map<Character, Integer> window = new HashMap<>();
char[] schars = s.toCharArray();
char[] pchars = p.toCharArray();
for (int i = 0; i < p.length(); i++) {
need.put(pchars[i], need.getOrDefault(pchars[i], 0) + 1);
}
int left = 0, right = 0;
int valid = 0;
List<Integer> result = new ArrayList<>();
while (right < schars.length) {
char c = schars[right];
right++;
if (need.containsKey(c)) {
window.put(c, window.getOrDefault(c, 0) + 1);
if (window.get(c).equals(need.get(c))) {
valid++;
}
}
while (right - left >= pchars.length) {
if (valid == need.size()) {
result.add(left);
}
char d = schars[left];
left++;
if (need.containsKey(d)) {
if (need.get(d).equals(window.get(d))) {
valid--;
}
}
window.put(d, window.getOrDefault(d, 0) - 1);
}
}
return result;
}
}