2

私は 7 文字の文字列を取得して、可能なすべての 3 文字と 4 文字の順列を生成しようとしています。これは、再帰が便利なように思えます (私が見たほとんどすべての順列ジェネレーターは再帰的です) が、繰り返しを避ける方法に行き詰まっています。つまり、入力文字列が「aabcdef」の場合、どの順列にも「a」の文字が 3 文字以上含まれないようにします。

あなたが提供できる洞察は大歓迎です。

4

6 に答える 6

2

これは、反復と再帰の両方で実行できます。ここにまともな順列ジェネレーターがあります。これはニーズに合わせて汎用化 (List<T>要素の取得) できるため、数値のリスト、文字列 (文字のリスト) などを取得できます。

于 2009-11-13T23:54:10.883 に答える
1

キャラクターをキャラクターのバッグの中の要素として考えてみてください。

動作するはずの擬似コードは次のとおりです。

permute ( bag < character > : theBag, integer : length, string : resultSoFar )
    if length <= 0 then:
       print resultSoFar
       exit
    end-if

    for each x in theBag:
        nextResult = resultSoFar + x
        nextBag = theBag - x
        permute( nextBag, length - 1, nextResult )
    end-for
end-method

幸運を!

于 2009-11-14T00:21:43.167 に答える
0

これはRubyにありますが、役立つ場合があります:http: //trevoke.net/blog/2009/12/17/random-constrained-permutations-in-ruby/

于 2010-01-19T20:05:58.247 に答える
0

文字のセットを取る関数を作成し、指定した文字で始まる n 個の順列 (3 または 4) のセットを返すようにします。次に、セット内の一意の文字ごとに 1 回実行します。

完全な結果セットは、サブセットの結合になります。

于 2009-11-13T23:49:28.867 に答える
0

@ Chip Uni: あなたのコードを実装すると、長さ x から最大までのすべての順列が生成されました。そのため、7 文字を含むバッグを長さ 3 で入力すると、長さ 3 から 7 のすべての順列が生成されました。ただし、長さ 4 を超える結果をすべて削除するのは簡単なことでした。

どうもありがとうございました!あなたの提案と支援に感謝します。

于 2009-11-14T18:39:44.520 に答える