Leetcode Java Lexicographically Smallest Equivalent String
업데이트:
문제
코드
class Solution {
public String smallestEquivalentString(String s1, String s2, String baseStr) {
int[] graph = new int[26];
for (int i = 0; i < 26; i++) {
graph[i] = i;
}
char[] s1CharArray = s1.toCharArray();
char[] s2CharArray = s2.toCharArray();
for (int i = 0; i < s1.length(); i++) {
int j = this.find(graph, s1CharArray[i] - 'a');
int k = this.find(graph, s2CharArray[i] - 'a');
if (k < j) {
graph[j] = k;
} else {
graph[k] = j;
}
}
StringBuilder sb = new StringBuilder();
for (char c : baseStr.toCharArray()) {
sb.append((char) ('a' + this.find(graph, c - 'a')));
}
return sb.toString();
}
private int find(int[] graph, int index) {
while (graph[index] != index) {
index = graph[index];
}
return index;
}
}
결과
설명
- 등치 문자열인 s1과 s2의 등가 정보를 이용하여, 사전적으로 가장 작은 등가 문자열인 baseStr을 반환하는 문제이다.
- 등치 문자열은 $s1 = abc$, $s2 = cde$일 때, “a” == “c”, “b” == “d”, “c” == “e”를 만족한다.
- 위를 이용하여 baseStr이 “eed” 문자열일 때, “acd”와 “aab”는 등가 문자열이며 이 중 “aab”는 사전적으로 가장 작은 등가 문자열이다.
- 문제 풀이에 필요한 변수를 정의한다.
- graph는 등치 문자열의 영문자 위치 값을 저장할 변수로, 26 크기의 정수 배열로 초기화하여 각 위치에 0부터 25까지 넣어준다.
- s1CharArray와 s2CharArray는 s1과 s2를 문자 배열로 저장한 변수이다.
- graph의 index번째 문자의 등치 문자열 탐색에 필요한 find(int[] graph, int index) 메서드를 정의한다.
- graph의 index번째 값이 index가 아닐 때 까지 index에 graph[index] 값을 넣어준 후, index를 반환한다.
- 0부터 s1의 길이 미만까지 i를 증가시키며 아래를 수행한다.
- j와 k에 s1CharArray와 s2CharArray의 i번째 문자의 영문자 순서를 이용하여 find 메서드를 수행한 결과를 각각 넣어준다.
- k가 j보다 작은 경우 사전적인 순서대로 저장해야 하므로, graph[j]에 k를 아니면 grpah[k]에 j를 넣어준다.
- 반복이 완료되면 최종 문자열을 만들기 위한 sb를 StringBuilder로 초기화한 후 baseStr의 각 문자를 순차적으로 c에 넣어 아래를 수행한다.
- sb에 ‘a’에 c의 영문자 순서를 이용하여 find 메서드를 수행한 결과를 더하여 이어준다.
- 반복이 완료되면 저장된 sb를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기