Я считаю, что это пока единственное представление, в котором не используется ни встроенная перестановка, ни случайная случайная выборка / сортировка. Хотя он длиннее, я думаю, что алгоритм довольно аккуратный.
lambda L:[p for s in L for i,c in enumerate(s)for p in[c+s[:i]+s[i+1:]]if~-(p in L)][0]
Попробуйте онлайн!
объяснение
То, что мы делаем, в основном это:
def unique_anagram(string_list):
for string in string_list:
for i, char in enumerate(string):
# Move the character to the beginning of the string
permutation = char + string[:i] + string[i+1:]
if permutation not in string_list:
return permutation
Вот доказательство того, что это работает:
Для строки S
определите front(S)
набор строк, полученный путем выбора одного символа из S
и перемещения его в начало S
. Например, front(ABCDE)
есть {ABCDE, BACDE, CABDE, DABCE, EABCD}
.
Теперь рассмотрим список анаграмм L
, который L
не содержит всех возможных анаграмм (согласно описанию проблемы). Мы хотим показать , что существует строка S
в L
таким образом, что front(S)
содержит , по меньшей мере , один анаграмму , S'
который не в L
.
Предположим в противоречие, что для каждой строки S
в L
, каждая строка в front(S)
также в L
. Заметьте, что мы можем сгенерировать произвольную перестановку любой строки с помощью серии «фронтовых» ходов. Например, чтобы получить
ABCDE -> BAEDC
мы можем сделать
ABCDE -> CABDE -> DCABE -> EDCAB -> AEDCB -> BAEDC
Мы предположили , что для каждого S
дюйма L
, каждый S'
в front(S)
также в L
. Это также означает , что каждый S''
в front(S')
находится в L
, и так далее. Следовательно, если S
находится в L
, каждая перестановка S
также в L
. Тогда L
должен быть полный набор анаграмм, противоречие.
Таким образом, поскольку мы гарантировали , что существует по крайней мере одна перестановка не в L
, должна существовать строка S
в L
течение которых некоторые S'
в front(S)
это не L
. QED.
Код перебирает front(S)
для каждого S
в L
и выбирает S'
который не находится в L
. По приведенному выше результату будет хотя бы один, S'
который соответствует требованиям.
itertools
ли ответ?