[Algorithm] Leet_438_FindAllAnagramsinaString
Leet_438_FindAllAnagramsinaString 접근방식
[Algorithm] Leet_438_FindAllAnagramsinaString
Leet_438_FindAllAnagramsinaString
문제 링크
https://leetcode.com/problems/find-all-anagrams-in-a-string/
카테고리
슬라이딩 윈도우
접근 방식
두 개의 빈도수를 관리하는 방식으로 문제를 해결할 수 있었다. 첫번째 target을 관리하는 target Map 두번째 윈도우를 진행하고있는 문자의 빈도수를 관리하는 map Map
HashMap의 메서드 .equals 를 사용하면 자동으로 키와 값을 비교해줘서 같다면 list에 시작 인덱스를 넣는 방식으로 해결했다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package ver2.Leet_438_FindAllAnagramsinaString;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
class Solution {
HashMap<Character, Integer> target;
public List<Integer> findAnagrams(String s, String p) {
int i = 0;
int j = 0;
int size = p.length();
int n = s.length();
List<Integer> ans = new ArrayList<>();
HashMap<Character,Integer> map = new HashMap<>();
target = new HashMap<>();
for(int x = 0; x < size; x++){
char c = p.charAt(x);
target.put(c, target.getOrDefault(c, 0) + 1);
}
while(j < n){
if(j - i + 1 < size){
map.put(s.charAt(j), map.getOrDefault(s.charAt(j), 0) + 1);
j++;
}
else{
map.put(s.charAt(j), map.getOrDefault(s.charAt(j), 0) + 1);
if(map.equals(target)) ans.add(i);
map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) - 1);
if(map.get(s.charAt(i)) == 0) map.remove(s.charAt(i));
i++;
j++;
}
}
return ans;
}
}
This post is licensed under CC BY 4.0 by the author.