必要があったので作ってみた。
順列生成メソッド
意外に難しかった・・・
自分で書き出しながら、生成ロジックを作った・・・
再帰使えばいいんじゃん、ってことに気づくのに時間がかかった・・・
#region GetPermutation
/// 順列生成
/// 対象文字列
/// 生成された組合せ
/// 同一文字が含まれていた場合は同じ組み合わせパターンが複数含まれます
static public string[] GetPermutation(string value) {
var list = new List();
GetPermutation(value.ToCharArray(), value.Length, list);
return list.ToArray();
}
static private char[] GetPermutation(char[] value, int count, List list) {
if (count <= 1) {
list.Add(String.Join(String.Empty, value.Cast().ToArray()));
return value;
}
var j = count - 1;
for(var i = j; i >= 0; --i) {
SwapChar(value, i, j);
value = GetPermutation(value, j, list);
SwapChar(value, i, j);
}
return value;
}
static private void SwapChar(char[] value, int index1, int index2) {
var t = value[index1];
value[index1] = value[index2];
value[index2] = t;
}
#endregion
これを使って以下のようにすると、abc の組み合わせが全て表示される。
foreach(var x in GetPermutation("abc")) Console.WriteLine(x);
abc
bac
acb
cab
cba
bca
こんな処理が何故必要になったかというと・・・
いや、話せば長くなるので来週の月曜日に改めてエントリーにあげたいと思います。