using System;
using System.Collections.Generic;
using System.Linq;
static class Program
{
private static void Main(string[] args)
{
"foo".ToCharArray().Permutate().ForEach(Console.WriteLine);
"abbccc".ToCharArray().Permutate().ForEach(Console.WriteLine);
Console.Read();
}
public static List<string> Permutate(this IEnumerable<char> s)
{
return s.SelectMany(x =>
{
var index = Array.IndexOf(s.ToArray(), x);
return
s.Where((y, i) => i != index)
.Permutate()
.Select(y => new string(new[] {x}.Concat(y).ToArray()))
.Union(new[] {new string(new[] {x})});
}).Distinct().Where(x => x.Length == s.Count()).ToList();
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpzdGF0aWMgY2xhc3MgUHJvZ3JhbQp7CiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKCXsKCQkiZm9vIi5Ub0NoYXJBcnJheSgpLlBlcm11dGF0ZSgpLkZvckVhY2goQ29uc29sZS5Xcml0ZUxpbmUpOwoJCSJhYmJjY2MiLlRvQ2hhckFycmF5KCkuUGVybXV0YXRlKCkuRm9yRWFjaChDb25zb2xlLldyaXRlTGluZSk7CgoJCUNvbnNvbGUuUmVhZCgpOwoJfQoKCXB1YmxpYyBzdGF0aWMgTGlzdDxzdHJpbmc+IFBlcm11dGF0ZSh0aGlzIElFbnVtZXJhYmxlPGNoYXI+IHMpCgl7CgkJcmV0dXJuIHMuU2VsZWN0TWFueSh4ID0+CgkJCXsKCQkJCXZhciBpbmRleCA9IEFycmF5LkluZGV4T2Yocy5Ub0FycmF5KCksIHgpOwoJCQkJcmV0dXJuCgkJCQkJcy5XaGVyZSgoeSwgaSkgPT4gaSAhPSBpbmRleCkKCQkJCQkgLlBlcm11dGF0ZSgpCgkJCQkJIC5TZWxlY3QoeSA9PiBuZXcgc3RyaW5nKG5ld1tdIHt4fS5Db25jYXQoeSkuVG9BcnJheSgpKSkKCQkJCQkgLlVuaW9uKG5ld1tdIHtuZXcgc3RyaW5nKG5ld1tdIHt4fSl9KTsKCQkJfSkuRGlzdGluY3QoKS5XaGVyZSh4ID0+IHguTGVuZ3RoID09IHMuQ291bnQoKSkuVG9MaXN0KCk7Cgl9Cn0KCg==