# LeetCode Easy 205. Isomorphic Strings
tags: leetcode
問題
アイデア
文字列s
とt
が与えられた時に,isomorphic
かどうか調べろという問題です.
isomorphic
とはs
の文字がt
の文字へ一対一に写像出来るということです.
ただし,2種類の文字が同じ文字に写像されることはなく,ある文字がその文字自身に写像されることはないです.
文字列の長さが同じという条件でこの問題を解く必要が有ります.
解法
- まずは
s
の文字をkeyとし,t
の文字をvalueとする連想配列を使います.s[i]
をkeyとしてないならば,新しく追加します.- あるならば,それが今までのvalueと同じか確認します.
- 違う場合は
false
を返します.
- 違う場合は
- 次に,2種類の文字が同じ文字に写像されていないかを確認します.そのために
t
からs
への連想配列を使います. - 文字列全体でこれを行い,
false
が出ていなければtrue
を返します.
計算量
s
, t
の文字列の大きさをそれぞれN
, M
とします.
- 時間計算量
- 文字列を走査するので$O(N + M)$です
- 空間計算量
- 多くてもアルファベットの数の2倍にしかならないので$O(1)$
C++
class Solution { public: bool isIsomorphic(string s, string t) { unordered_map<char, char> s2t, t2s; for (auto i = 0; i < s.size(); ++i) { if (s2t.find(s[i]) == s2t.end()) s2t[s[i]] = t[i]; else if (s2t[s[i]] != t[i]) return false; if (t2s.find(t[i]) == t2s.end()) t2s[t[i]] = s[i]; else if (t2s[t[i]] != s[i]) return false; } return true; } };