Программа курса:
Разбор задачи: Изоморфные строки
Предложенный нами код решения:
def is_isomorphic(s, t):
"""
Проверяет, являются ли строки s и t изоморфными.
:param s: строка
:param t: строка
:return: True, если строки изоморфны, иначе False
"""
if len(s) != len(t):
return False
# Отображение символов из s в t и наоборот
map_s_to_t = {}
map_t_to_s = {}
for char_s, char_t in zip(s, t):
if char_s in map_s_to_t:
if map_s_to_t[char_s] != char_t:
return False
else:
map_s_to_t[char_s] = char_t
if char_t in map_t_to_s:
if map_t_to_s[char_t] != char_s:
return False
else:
map_t_to_s[char_t] = char_s
return True1. Начальная проверка длины строк
if len(s) != len(t):
return False
Если длины строк s и t различны, они не могут быть изоморфными, так как не получится сопоставить все символы одной строки с символами другой.
2. Инициализация отображений
map_s_to_t = {}
map_t_to_s = {}
Для проверки изоморфности используются два словаря:
map_s_to_t: хранит соответствие символов из строкиsсимволам строкиt.map_t_to_s: хранит обратное соответствие — символов из строкиtсимволам строкиs.
3. Проход по строкам
for char_s, char_t in zip(s, t):
Используется zip, чтобы одновременно проходить по символам обеих строк. На каждой итерации:
char_s— текущий символ из строкиs.char_t— текущий символ из строкиt.
4. Проверка и добавление отображений
Для каждого символа из обеих строк:
Проверка существующего отображения в
map_s_to_t:if char_s in map_s_to_t: if map_s_to_t[char_s] != char_t: return FalseЕсли символ
char_sуже сопоставлен какому-то символу вmap_s_to_t, проверяем, совпадает ли это сопоставление с текущим символомchar_t. Если нет, строки не изоморфны.Добавление нового сопоставления в
map_s_to_t:else: map_s_to_t[char_s] = char_tЕсли
char_sещё не был добавлен вmap_s_to_t, добавляем его сопоставление сchar_t.Проверка существующего отображения в
map_t_to_s:if char_t in map_t_to_s: if map_t_to_s[char_t] != char_s: return FalseАналогично проверяем обратное сопоставление символа
char_tвmap_t_to_s. Если сопоставление нарушено, строки не изоморфны.Добавление нового сопоставления в
map_t_to_s:else: map_t_to_s[char_t] = char_sЕсли
char_tещё не был добавлен вmap_t_to_s, добавляем его сопоставление сchar_s.
5. Возврат результата
Если цикл завершился без нарушений, строки изоморфны, и функция возвращает True:
return True
Пример работы функции
Пример 1:
s = "egg"
t = "add"
- Инициализация:
map_s_to_t = {},map_t_to_s = {}. - Итерация 1:
char_s = 'e',char_t = 'a'.
Добавляетсяmap_s_to_t = {'e': 'a'},map_t_to_s = {'a': 'e'}. - Итерация 2:
char_s = 'g',char_t = 'd'.
Добавляетсяmap_s_to_t = {'e': 'a', 'g': 'd'},map_t_to_s = {'a': 'e', 'd': 'g'}. - Итерация 3:
char_s = 'g',char_t = 'd'.
Проверяется сопоставление: корректно. - Результат:
True.
Пример 2:
python
Копировать код
s = "foo"
t = "bar"
- Инициализация:
map_s_to_t = {},map_t_to_s = {}. - Итерация 1:
char_s = 'f',char_t = 'b'.
Добавляетсяmap_s_to_t = {'f': 'b'},map_t_to_s = {'b': 'f'}. - Итерация 2:
char_s = 'o',char_t = 'a'.
Добавляетсяmap_s_to_t = {'f': 'b', 'o': 'a'},map_t_to_s = {'b': 'f', 'a': 'o'}. - Итерация 3:
char_s = 'o',char_t = 'r'.
Нарушение:map_s_to_t['o'] = 'a', но текущийchar_t = 'r'. - Результат:
False.