동일한 길이 두 문자열이 주어졌을 때 문자열 s를 문자열 t로 변환할 수 있는지 확인하면 된다. 변환하는 방법은 다음과 같다.
- 동일한 문자들은 동일한 문자로 변환된다. Ex) a는 모두 b로 변환된다.
- 서로 다른 문자는 서로 다른 문자로 변환된다. Ex) a가 b로 변환된다면 다른 문자가 b로 변환될 수 없다.
- 자기 자신으로 변환이 가능하다. Ex) a는 a로 변환이 가능하다.
Map과 Set을 통해 변환 가능 여부를 확인하면 한 문자씩 변환한다.
문자열 s의 문자들을 하나씩 탐색할 때 다음과 같이 탐색한다.
1. 문자가 Map의 key로 있는지 확인한다.
- Key로 있다면 이전에 변환한 문자이다. 즉, Map[char] == t[index]이어야 한다.
- 만약 이전 변환 기록과 변환 타겟 문자가 다르다면 두 문자열은 변환이 불가능하다.
2. Set이 변환 타겟 문자를 가지고 있는지 확인한다.
- Map에 변환 기록이 없는데 변환 타겟 문자가 이미 Set에 있다면 두 문자열은 변환이 불가능하다.
3. Map과 Set에 변환을 기록한다.
class Solution {
fun isIsomorphic(s: String, t: String): Boolean {
val map = mutableMapOf<Char, Char>()
val set = mutableSetOf<Char>()
s.forEachIndexed { i, c ->
if (map.containsKey(c)) {
if (map[c] != t[i]) return false
} else if (set.contains(t[i])) return false
map[c] = t[i]
set += t[i]
}
return true
}
}
글 잘 봤습니다, 감사합니다.