Leetcode Java Find All Anagrams in a String
업데이트:
문제
코드
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> result = new ArrayList<>();
if (p.length() > s.length()) {
return result;
}
int[] countP = new int[26];
for (int idx = 0; idx < p.length(); idx++) {
countP[p.charAt(idx) - 97]++;
}
int[] countS = new int[26];
int idx = 0;
int i = 0;
while (idx < p.length() && idx < s.length()) {
countS[s.charAt(idx++) - 97]++;
}
while (idx <= s.length()) {
int j = 0;
while (j < 26 && countP[j] == countS[j]) {
j++;
}
if (j == 26) {
result.add(i);
}
countS[s.charAt(i) - 97]--;
i++;
if (idx != s.length()) {
countS[s.charAt(idx) - 97]++;
}
idx++;
}
return result;
}
}
결과
설명
- 문자열 s와 p가 주어지면, p를 이용한 아나그램이 가능한 위치를 모두 반환하는 문제이다.
- 아나그램이란 문자의 재 배열로 특정 문자열을 만들 수 있는 단어 또는 어구이다.
-
결과를 저장할 result를 ArrayList로 초기화 하고 p의 길이가 s의 길이보다 길 경우 아나그램으로 재 배열해서 만들 수 없으므로, 아무것도 들어있지 않은 result를 주어진 문제의 결과로 반환한다.
- 문제 풀이에 필요한 변수를 정의한다.
- countP는 p에 들어간 문자의 발생 횟수를 저장할 배열로, 영문자의 개수인 26 크기로 정의하고 p를 반복하여 각 문자 별 a(97)을 뺀 위치 값을 증가시켜준다.
- countS는 s에 들어간 문자의 발생 횟수를 저장할 배열로, 영문자의 개수인 26 크기로 정의한다.
- idx는 s를 순회하기 위한 위치 변수로, 0으로 초기화한다.
- i는 아나그램이 성립하는 위치 변수로, 0으로 초기화한다.
-
idx가 p와 s의 길이 미만까지 반복하여 countS에 해당 문자의 위치 값을 넣고 idx를 증가시킨다.
- idx가 s의 길이 이하일 때까지 아래를 반복한다.
- j를 0으로 초기화 시키고, j가 26 미만이고 countP와 countS의 값이 동일한지 검증하여 j를 증가시킨다.
- j가 26이면 문자열이 동일하다는 의미이므로, result에 i를 넣어준다.
- countS에 문자열 s의 i번째 문자에 해당하는 위치의 값을 감소시켜 검증에 해당 문자를 배제하고 i를 증가시킨다.
- idx가 s의 길이가 아닌 경우, countS에 문자열 s의 idx번째 문자에 해당하는 위치 값을 증가시켜 count를 추가한다.
- idx를 증가시키고 반복을 계속 수행한다.
- 반복이 완료되면 아나그램이 성립하는 모든 위치 값을 넣은 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기