import java.util.*;
class Solution {
public int[] solution(String s) {
int[] alphabetIdx = new int[123]; // 현재 탐색에서 가장 가까운 등장 인덱스
Arrays.fill(alphabetIdx, -1); // -1로 초기화
int[] answer = new int[s.length()];
Arrays.fill(answer, -1);
for(int i = 0; i<s.length(); i++){
char alpha = s.charAt(i);
if (alphabetIdx[alpha] != -1) {
answer[i] = i - alphabetIdx[alpha];
}
alphabetIdx[alpha] = i;
}
return answer;
}
}
// 'z'가 122이므로 넉넉하게 123 크기의 배열 생성
int[] alphabetIdx = new int[123];
// 등장하지 않은 경우를 구분하기 위해 -1로 초기화
Arrays.fill(alphabetIdx, -1);
배열의 'a' 의 앞 공간 (0~96) 은 낭비되지만 인덱스 매핑 연산을 피할 수 있다.
char alpha = s.charAt(i); // 현재 문자 (예: 'a'면 97)
if (alphabetIdx[alpha] != -1) {
// 이전에 등장했다면 (현재 인덱스 - 마지막 등장 인덱스)
answer[i] = i - alphabetIdx[alpha];
} else { // answer 배열의 경우 초기화를 미리 하지 않아도 분기로 처리할 수 있다.
// 처음 등장했다면 -1
answer[i] = -1;
}
// 현재 문자의 ASCII 위치에 현재 인덱스 저장
alphabetIdx[alpha] = i;
}
return answer;
}
}
int[] lastPos = new int[26]; // 알파벳 소문자 개수
Arrays.fill(lastPos, -1);
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
int index = ch - 'a'; // 'a'는 0, 'b'는 1 ... 'z'는 25가 됨
if (lastPos[index] == -1) {
answer[i] = -1;
} else {
answer[i] = i - lastPos[index];
}
lastPos[index] = i;
}