2010-12-14 33 views
4

可能性の重複:
Generate list of all possible permutations of a string可能な文字列の組み合わせのリストを作成する

こんにちはみんな、

私は私ができるようにする必要があり、小さなアルゴリズムのプロジェクトで作業する必要があります与えられた制限に基づいて与えられた文字セットの可能な組み合わせをテキストファイルにリストして書き込む。私は「A」、「B」、および「c」を文字を入力し、3に制限を設定した場合

例えば、可能な出力は次のようになります。

a 
b 
c 
aa 
bb 
cc 
ab 
ac 
ba 
bc 
ca 
cb 
... 
    aaa 
    bbb 
    ccc 
    ... 
    ... 
    abc 
    acb 
    bac 
    bca 
    cab 
    cba 

すべての可能な組み合わせが考案されているまで、 。

これをテキストファイルに書き込むことは問題ありません。その組み合わせを書くアルゴリズムを持つことは、私があまりよくしていないことです。

.NET(C#またはVB)コードでお楽しみください。

ありがとうございました。

PS

サイドノートでは、私はそれが可能なすべてのキーボード文字の文字列の組み合わせを作成し、どのように大きなファイルがあることをなるだろうアプリケーションのためにかかるだろうどのくらいだろう。

更新: 私も

+0

「文字組み合わせアルゴリズム」のクイックグーグルサーチで、このディスカッションが見つかりました。これは、アルゴリズムの概要を説明する最初のヒットです。http://www.daniweb.com/ forums/thread110604.html – FrustratedWithFormsDesigner

+0

サイズ 'b'のセットから' n'個の項目の 'n ** b'個のユニークな順列があります。 (特に、これは、基数bのn桁の数字が表すことができる数字の数を示します(例えば、5ビット: '2 ** 5 == 32 '))。 ASCII(印刷可能な95文字)を仮定しても、857,375の3文字、81,450,625の4文字の文字列があります。これはexpotentiallyに成長する。そして、今や、あなたは256文字のUnicodeのコードページを持っています。多くの目的のために、はるかに安価なソリューションがあります... – delnan

答えて

1

再帰的な実装を使用して、文字列内のすべての順列を列挙できます。すばやく機能的な実装は次のようになります。

編集:長さが入力文字セットより短い文字列を含むようにOPを変更しました。次のコードが変更されました。それはあなたの質問の出力を正確に示します。

static void BuildPermutations(string input, char[] current, int index, int depth, List<string> perms) 
{ 
    if (index == depth) 
    { 
     perms.Add(new string(current, 0, depth)); 
     return; 
    } 
    for (int n = 0; n < input.Length; ++n) 
    { 
     current[index] = input[n]; 
     BuildPermutations(input, current, index + 1, depth, perms); 
    } 
} 


static void Main(string[] args) 
{ 
    string input = "abc"; 
    char[] current = new char[input.Length]; 
    List<string> perms = new List<string>(); 
    for (int n = 1; n <= 3; ++n) 
     BuildPermutations(input, current, 0, n, perms); 
    foreach (string s in perms) 
     System.Console.WriteLine(s.ToString()); 
} 
1

まあを参照してください。..暗黙の限界までn文字から文字の組み合わせを示すべきは、あなたの例のために、私はこのような何かを試してみてください。

string chars = "abc"; 

for (int a = 0; a < chars.Length; a++) 
{ 
    for (int b = 0; b < chars.Length; b++) 
    { 
     for (int c = 0; c < chars.Length; c++) 
     { 
      string row = String.Format("{0}{1}{2}", chars[a], chars[b], chars[c]); 
     } 
    } 
} 

これはちょうどここに入力されているため、エラーが含まれている可能性があります。また、文字の制限が可能な文字の数に結びついているかどうかはわかりません。しかし、おそらくこれはあなたに出発点を与えるでしょう。

関連する問題