You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.2 KiB
59 lines
1.2 KiB
2 years ago
|
package class38;
|
||
|
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.HashMap;
|
||
|
import java.util.List;
|
||
|
|
||
|
public class Problem_0438_FindAllAnagramsInAString {
|
||
|
|
||
|
public static List<Integer> findAnagrams(String s, String p) {
|
||
|
List<Integer> ans = new ArrayList<>();
|
||
|
if (s == null || p == null || s.length() < p.length()) {
|
||
|
return ans;
|
||
|
}
|
||
|
char[] str = s.toCharArray();
|
||
|
int N = str.length;
|
||
|
char[] pst = p.toCharArray();
|
||
|
int M = pst.length;
|
||
|
HashMap<Character, Integer> map = new HashMap<>();
|
||
|
for (char cha : pst) {
|
||
|
if (!map.containsKey(cha)) {
|
||
|
map.put(cha, 1);
|
||
|
} else {
|
||
|
map.put(cha, map.get(cha) + 1);
|
||
|
}
|
||
|
}
|
||
|
int all = M;
|
||
|
for (int end = 0; end < M - 1; end++) {
|
||
|
if (map.containsKey(str[end])) {
|
||
|
int count = map.get(str[end]);
|
||
|
if (count > 0) {
|
||
|
all--;
|
||
|
}
|
||
|
map.put(str[end], count - 1);
|
||
|
}
|
||
|
}
|
||
|
for (int end = M - 1, start = 0; end < N; end++, start++) {
|
||
|
if (map.containsKey(str[end])) {
|
||
|
int count = map.get(str[end]);
|
||
|
if (count > 0) {
|
||
|
all--;
|
||
|
}
|
||
|
map.put(str[end], count - 1);
|
||
|
}
|
||
|
if (all == 0) {
|
||
|
ans.add(start);
|
||
|
}
|
||
|
if (map.containsKey(str[start])) {
|
||
|
int count = map.get(str[start]);
|
||
|
if (count >= 0) {
|
||
|
all++;
|
||
|
}
|
||
|
map.put(str[start], count + 1);
|
||
|
}
|
||
|
}
|
||
|
return ans;
|
||
|
}
|
||
|
|
||
|
}
|