LCR 015. 문자열에서 모든 철자 바꾸기 찾기
문제 해결 아이디어
- 슬라이딩 윈도우는 조건을 만족하는 모든 왼쪽 경계를 찾습니다.
- 두 개의 맵을 생성합니다. 하나는 실제 필요한 유효한 문자를 기록하고 다른 하나는 창의 유효한 문자 수를 기록합니다.
- 초기화 필요
- 문자를 순회할 때마다 유효한 문자인지 판단하고, 창이 업데이트되면 창의 유효한 문자 수가 필요한 유효한 문자 수와 같은지 여부도 판단합니다. 유효한 업데이트됨
- 창 길이가 너무 길면 경계를 줄여 왼쪽 창의 문자가 유효한 문자인지 확인해야 합니다.창을 업데이트하고 유효합니다.
- 모든 왼쪽 여백을 기록
- 그런 다음 돌아오다
class Solution {
public List<Integer> findAnagrams(String s, String p) {
Map<Character,Integer> need = new HashMap<>();
Map<Character,Integer> window = new HashMap<>();
for(int i = 0; i< p.length(); i++){
char c = p.charAt(i);
need.put(c,need.getOrDefault(c,0) + 1);
}
int left = 0;
int right = 0;
int valid = 0;
List<Integer> res = new ArrayList<>();
while(right < s.length()){
char c = s.charAt(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 >= p.length()){
if(valid == need.size()){
res.add(left);
}
char d = s.charAt(left);
left++;
if(need.containsKey(d)){
if(window.get(d).equals(need.get(d))){
valid--;
}
window.put(d,window.get(d) - 1);
}
}
}
return res;
}
}