Основываясь на последующих комментариях, правило состоит в том, что мы должны использовать все символы в целевом слове, но мы можем использовать каждый символ столько раз, сколько захотим.
Я бы установил поиск структуры данных "словаря" как Python dict
, который отображает отсортированные уникальные символы как кортежи в каждом словарном слове в список фактических слов, которые могут быть сформированы из этих символов.
Далее я 'd обрабатывать поиск следующим образом:
- Сортировать уникальные символы ввода пользователя (целевое слово) и индексировать в словаре, чтобы получить список слов, которые он мог бы составить. Использование
set
означает, что мы разрешаем повторение, а сортировка символов означает, что мы нормализуем все возможные перестановки этих букв. - Одно только приведенное выше может давать ложные срабатывания, поэтому мы фильтруем полученный список слов для удаления любые фактические слова результата, которые короче целевого слова. Это гарантирует, что мы правильно обрабатываем целевое слово, например
"artt"
, и предотвращаем его совпадение с "art"
.
Код:
from collections import defaultdict
class Dictionary:
def __init__(self, words):
self.dictionary = defaultdict(list)
for word in words:
self.dictionary[tuple(sorted(set(word)))].append(word)
def search(self, target):
candidates = self.dictionary[tuple(sorted(set(target)))]
return [x for x in candidates if len(x) >= len(target)]
if __name__ == "__main__":
dictionary = Dictionary(["tar", "art", "tart", "rat"])
tests = ["art", "artt", "ar", "arttt", "aret"]
for test in tests:
print(f"{test}\t=> {dictionary.search(test)}")
Вывод:
art => ['tar', 'art', 'tart', 'rat']
artt => ['tart']
ar => []
arttt => []
aret => []
Проблемы в исходном коде были хорошо рассмотрены в других ответах. Logi c не кажется ясным, так как он сравнивает символы со словами, а имена переменных часто не соответствуют logi c, представленному кодом.
Можно использовать частотомер, но вы застрянете в итерации по словарю, и вам нужно будет проверить, что каждый счетчик символа в словарном слове больше, чем соответствующий счетчик в целевое слово. Я сомневаюсь, что предлагаемый мной код оптимален, но я думаю, что он должен быть намного быстрее, чем метод счетчика.