Какой может быть самый эффективный (с точки зрения времени) алгоритм для генерации анаграмм?

Ниже приведен код, который я придумал, чтобы найти анаграммы данной строки, однако я обнаружил, что это очень медленно, когда строка очень большая. Что я могу сделать, чтобы сделать это быстрее? Есть ли другой алгоритм, который делает эту операцию быстрой?

def combinate(stri, comb,n,li):
    if stri == "":
        if comb not in li:
            li.append(comb)
        return
    for sdx, s in enumerate(stri):
        combinate(stri[0:sdx] + stri[sdx + 1:], comb+s,n)

2 ответа

Сортируйте символы в строке и в возможных анаграммах и сравнивайте отсортированные версии.

"task": "akst"
"skat": "akst"

Обратите внимание, что словарная запись по ключу "akst" может содержать список анаграмм в качестве значения

Если вы ищете "наиболее эффективный" по сложности времени, возьмите каждый термин и отсортируйте его символы по порядку, а затем сохраните их в (многозначной) карте. По заданному слову, для которого вы хотите найти анаграммы, также сортируйте его символы и ищите соответствующие записи на карте. Это будет O(1) для каждого поиска, хотя предварительное вычисление является линейным по общему количеству членов.

Я думаю, что можно с уверенностью сказать, что это наилучшая возможная временная сложность, но вы можете по-разному обрабатывать анаграммы из нескольких слов - это будет непрактично для комбинаций из нескольких слов (предварительное вычисление будет очень большим), так что вы, вероятно, захотите построить свою анаграмму по одному слову за раз.

Другие вопросы по тегам