Это лучший способ создания анаграмм для текста (не более 80 символов). Пример: Ввод: dog output dog dgo odg ogd gdo god

Я думаю только о решении для поиска с возвратом, но это займет некоторое время, если текст будет длиннее.

Другая мысль состоит в том, чтобы собрать все слова в словаре, но проблема не требует настоящих слов.

Может кто-нибудь указать решение с минимальной временной сложностью?

Спасибо!

2
Dan Dinu 25 Авг 2011 в 12:21

2 ответа

Вот простая реализация, на случай, если она вам понадобится:

IEnumerable<List<T>> Permutations<T>(List<T> items)
{
    if (items.Count == 0) yield return new List<T>();

    var copy = new List<T>(items);
    foreach (var i in items)
    {
        copy.Remove(i);
        foreach (var rest in Permutations(copy))
        {
            rest.Insert(0, i);
            yield return rest;
        }
        copy.Insert(0, i);
    }

}

IEnumerable<string> Anagrams(string word)
{
    return Permutations(word.ToCharArray().ToList()).Select(x => new String(x.ToArray()));
}

Ответ относительно временной сложности дал Адитья. Чтобы понять их ответ, вы должны знать, что их нет! = 1 * 2 * ... * n перестановок для n элементов. Мой алгоритм является доказательством этого (или основан на прямом доказательстве)

8
boop 17 Июл 2018 в 15:45

Отслеживание с возвратом - самый быстрый способ сделать это. Когда вам нужны все анаграммы для текста, это означает, что вам нужно все n! его перестановки. Итак, предполагая, что для печати / генерации каждой перестановки требуется по крайней мере O (1), ваш алгоритм в любом случае будет принимать O (n!), Поэтому вы не можете сделать быстрее, чем решение для обратного отслеживания.

3
Adithya Surampudi 25 Авг 2011 в 08:28