Разбор задачи: Изоморфные строки

Предложенный нами код решения:

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 True

1. Начальная проверка длины строк

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. Проверка и добавление отображений

Для каждого символа из обеих строк:

  1. Проверка существующего отображения в 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. Если нет, строки не изоморфны.

  2. Добавление нового сопоставления в map_s_to_t:

    else:
        map_s_to_t[char_s] = char_t
    

    Если char_s ещё не был добавлен в map_s_to_t, добавляем его сопоставление с char_t.

  3. Проверка существующего отображения в 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. Если сопоставление нарушено, строки не изоморфны.

  4. Добавление нового сопоставления в 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.

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии