Это лучший способ создания анаграмм для текста (не более 80 символов). Пример: Ввод: dog output dog dgo odg ogd gdo god
Я думаю только о решении для поиска с возвратом, но это займет некоторое время, если текст будет длиннее.
Другая мысль состоит в том, чтобы собрать все слова в словаре, но проблема не требует настоящих слов.
Может кто-нибудь указать решение с минимальной временной сложностью?
Спасибо!
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 элементов. Мой алгоритм является доказательством этого (или основан на прямом доказательстве)
Отслеживание с возвратом - самый быстрый способ сделать это. Когда вам нужны все анаграммы для текста, это означает, что вам нужно все n! его перестановки. Итак, предполагая, что для печати / генерации каждой перестановки требуется по крайней мере O (1), ваш алгоритм в любом случае будет принимать O (n!), Поэтому вы не можете сделать быстрее, чем решение для обратного отслеживания.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.