diff --git a/DIRECTORY.md b/DIRECTORY.md index 0f9859577493..89d3442b44f3 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -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) diff --git a/strings/is_isomorphic.py b/strings/is_isomorphic.py new file mode 100644 index 000000000000..244f4cb17f87 --- /dev/null +++ b/strings/is_isomorphic.py @@ -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