438. Find All Anagrams in a String
notice:
// array compare
if (Arrays.equals(map, cMap)) {
// map compare
if (map.equals(cMap)) {T: O(n*26)
S: O(26)class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> res = new ArrayList<>();
Map<Character, Integer> map = new HashMap<>();
for (char c : p.toCharArray()) {
map.put(c, map.getOrDefault(c, 0) + 1);
}
int winsize = p.length();
int left = 0;
Map<Character, Integer> cMap = new HashMap<>();
for (int right = 0; right < s.length(); right++) {
char c = s.charAt(right);
cMap.put(c, cMap.getOrDefault(c, 0) + 1);
if (right - left + 1 > winsize) {
char lc = s.charAt(left);
cMap.put(lc, cMap.getOrDefault(lc, 0) - 1);
if (cMap.get(lc) == 0) {
cMap.remove(lc);
}
left++;
}
if (right - left + 1 == winsize) {
if (map.equals(cMap)) {
res.add(left);
}
}
}
return res;
}
}
/*
use sliding win with p's size
"cbaebabacd"
[ ]
[ ]
[ ]
compare two hashmap each other is equal
T: O(n*26)
S: O(26)
*/same to 76, 567
Last updated
Was this helpful?