Leetcode
[Leetcode] 205. Isomorphic Strings - JS
Wix
2024. 10. 16. 10:00

https://leetcode.com/problems/isomorphic-strings/?envType=study-plan-v2&envId=top-interview-150
1. 문제 분석
문제분석
--------------------
- s, t 두 문자열이 주어질 때, 이들이 isomorphic(동형)인지 판단하라.
- s의 문자를 대체하여 t의 문자로 바꿀 수 있으면 isomorphic(동형)이다.
- 문자의 순서를 유지하면서 다른 문자로 바껴야 한다.
제한조건
--------------------
- 1 <= s.length <= 5*10^4
- t.length === s.length
- s, t는 유효한 아스키 코드로 구성된다.
2. 접근 방법
접근방법
--------------------
두 문자열의 길이는 동일하므로 각 문자열이 포함한 유일한 문자의 갯수가 동일한지 판단한다.
예를 들어, t 문자열은 3가지 문자로 이뤄져있고 s 문자열은 4가지 문자로 이뤄져있으면
t로는 s문자열을 만들 수 없으므로 false이다.
예외 ❗️
s = 'bbbaaaba'
t = 'aaabbbba'
s문자열의 'b' -> 'a', 'a' -> 'b'로 바꾸면
'aaabbbab' 이므로 t와 다르므로 false
hash의 key 갯수는 동일하지만 동형은 아니다.
동형을 판단하려면 위치(index)까지 고려해야한다.
3. 코드
var isIsomorphic = function(s, t) {
let hash = {};
for (let i = 0; i < s.length; i++) {
if (!Object.values(hash).includes(t[i])) {
hash[s[i]] = t[i];
}
}
// 각 인덱스마다 s문자열을 t문자열로 변환했을때, t와 같은지 비교
for (let i = 0; i < s.length; i++) {
if (hash[s[i]] !== t[i]) return false;
}
return true
};
4. 복잡도 분석
- 시간복잡도: O(n^2)
- 공간복잡도: O(n)
매번 hash에 문자를 등록할 때 마다 hash의 value 값들을 순회해서 체크하므로, 최악의 경우 시간 복잡도가 O(N^2)이다.
시간 복잡도를 개선해서 풀어보자.
5. 복잡도 개선된 풀이
var isIsomorphic = function(s, t) {
let hash = {};
let reversedHash = {};
for (let i = 0; i < s.length; i++) {
const charS = s[i];
const charT = t[i];
if (!hash[charS]) {
hash[charS] = charT;
} else if (hash[charS] !== charT) {
return false;
}
if (!reversedHash[charT]) {
reversedHash[charT] = charS;
} else if (reversedHash[charT] !== charS) {
return false;
}
}
return true;
};
s와 t 문자열을 매핑한 hash와 반대로 매핑한 reversedHash를 선언한다.
각 hash에 매핑된 문자열이 없으면 초기값으로 추가해주고
만약 존재하는데, 매핑된 값이 다르면 false를 반환해준다.
모든 반복문이 종료되었다면 true를 반환한다.
위 코드는 시간복잡도: O(n)으로 개선할 수 있다.