Перемешиватель символов в строке
Приложение должно перемешивать символы в заданной строке и выводить все вариации этих перемешиваний, но выводит только один вариант несколько раз.
string str = "RNDSTR";
string genStr = "";
int combNum = str.Length * str.Length;
string[] abbs = new string[combNum];
char[] chr = str.ToCharArray();
Random rnd = new Random();
Console.WriteLine(combNum);
for (int i = 0; i < str.Length; i++)
{
genStr += chr[rnd.Next(1, str.Length)];
if (i+1==str.Length)
{
for (int j = 0; j < abbs.Length; j++)
{
if (abbs[j]==genStr)
{
break;
}
else
{
abbs[j] = genStr;
Console.WriteLine(genStr+"\n");
}
}
}
}
Ответы (2 шт):
Автор решения: Andrei Khotko
→ Ссылка
В английской терминологии эта задача называется Get all permutations. Данный код выводит все возможные перестановки символов строки без повторений. За основу взят код c сайта GeeksforGeeks.
using System;
public class Program
{
private static void Permute(string str, int l, int r)
{
if (l == r)
Console.WriteLine(str);
else
{
for (int i = l; i <= r; i++)
{
str = Swap(str, l, i);
Permute(str, l + 1, r);
str = Swap(str, l, i);
}
}
}
public static string Swap(string str, int i, int j)
{
var charArray = str.ToCharArray();
char temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
return new String(charArray);
}
public static void Main()
{
const string str = "RNDSTR";
Permute(str, 0, str.Length - 1);
}
}
Автор решения: Ulysses
→ Ссылка
Проблема в том, что в строке символы могут повторяться, т. е. это перестановки с повторениями. Они несложно реализуются с помощью рекурсии и итератора. Ниже пример программы, выводящей построчно в лексикографическом порядке всевозможные различные перестановки введенной строки:
using System;
using System.Collections.Generic;
using System.Text;
namespace Permutations
{
class Program
{
static void Main()
{
Console.WriteLine("Введите строку:");
var str = Console.ReadLine();
var comb = new Combinatorics();
var numb = 0;
Console.WriteLine("\nПерестановки:\n");
foreach (var permutation in comb.Permutation(str))
{
Console.WriteLine(permutation);
numb++;
}
Console.WriteLine($"\nОбщее число перестановок: {numb}");
}
}
public class Combinatorics
{
public IEnumerable<string> Permutation(string s)
{
if (s == string.Empty)
yield return string.Empty;
else
{
var set = new SortedSet<char>(s);
foreach (var ch in set)
{
var substring = (new StringBuilder(s).Remove(s.IndexOf(ch), 1)).ToString();
foreach (var p in Permutation(substring))
yield return ch + p;
}
}
}
}
}