Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -1335,6 +1335,7 @@
* [Indian Phone Validator](strings/indian_phone_validator.py)
* [Is Contains Unique Chars](strings/is_contains_unique_chars.py)
* [Is Isogram](strings/is_isogram.py)
* [Is Isomorphic](strings/is_isomorphic.py)
* [Is Pangram](strings/is_pangram.py)
* [Is Polish National Id](strings/is_polish_national_id.py)
* [Is Spain National Id](strings/is_spain_national_id.py)
Expand Down
48 changes: 48 additions & 0 deletions strings/is_isomorphic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
def is_isomorphic(s: str, t: str) -> bool:
"""
LeetCode No. 205 Isomorphic Strings
Given two strings s and t, determine if they are isomorphic.
https://leetcode.com/problems/isomorphic-strings/description/

Two strings s and t are isomorphic if the characters in s can be
replaced to get t.

All occurrences of a character must be replaced with another character
while preserving the order of characters. No two characters may map to
the same character, but a character may map to itself.


>>> is_isomorphic("egg", "add")
True
>>> is_isomorphic("foo", "bar")
False
>>> is_isomorphic("paper", "title")
True
>>> is_isomorphic("ab", "aa")
False
"""
if len(s) != len(t):
return False

mapping: dict[str, str] = {}
mapped = set()

for char_s, char_t in zip(s, t):
if char_s in mapping:
if mapping[char_s] != char_t:
return False
else:
if char_t in mapped:
return False
mapping[char_s] = char_t
mapped.add(char_t)

return True


if __name__ == "__main__":
import doctest

doctest.testmod()

print(is_isomorphic("egg", "add")) # True