Помогите решить логическую задачу

Санта-Клаус решил разобрать свою клавиатуру, чтобы её почистить. После того, как он поставил все клавиши обратно, он с ужасом понял, что что-то не так: некоторые пары клавиш перепутаны между собой! Таким образом, Санта-Клаус подозревает, что каждая клавиша либо стоит на своём месте, либо заняла место другой, а та другая — на месте первой.

Для того, чтобы убедиться в этом, найти ошибку и восстановить верное расположение, Санта-Клаус набрал текст своей любимой скороговорки, смотря только на надписи на клавиатуре.

Вам даны любимая скороговорка Санта-Клауса и строка, которая получилась в результате набора. Определите, какие пары клавиш Санта-Клаус мог перепутать. Каждая клавиша должна принадлежать не более чем одной паре перепутанных клавиш.


Ответы (1 шт):

Автор решения: MBo

Например, так - делаете словарь, и для каждой пары символов на соответствующих позициях записываете в словарь (a:b), где a - меньший по алфавиту символ, если данный ключ ещё не использован.

Если по ключу а найдено другое значение -всё, приехали, здравствуйте, бабушка, выводим -1

Если такое же - ничего не делаем.

В конце вывести пары из словаря, кроме содержащих одинаковые элементы (a:a)

Ввиду ограниченности алфавита можно просто массив на 26 элементов использовать.

def keyboard(s, u):
    dict = {}
    for i in range(len(s)):
        cs = s[i]
        cu = u[i]
        if cs > cu:
            cs, cu = cu, cs
        if cs in dict.keys():
            t = dict[cs]
            if t != cu:
                print(-1)
                return
        else:
            dict[cs] = cu
    # здесь  можно очистить словарь от дубликатов, чтобы счётчик вывести
    for cs, cu in dict.items():
        if cs != cu:
            print(cs, cu)

keyboard("helloworld", "ehoolwlroz")
keyboard("helloworld", "ehoolwlrzz")
keyboard("helloworld", "ehoolwlrlz")
keyboard("gndggadlmdefgejidmmcglbjdcmglncfmbjjndjcibnjbabfab", "fihffahlmhogfojnhmmcflkjhcmflicgmkjjihjcnkijkakgak")
→ Ссылка