2

文字列のすべての組み合わせを出力するアルゴリズムはいくつかありますが、特定の順序で出力するアルゴリズムが必要です。現在、この質問の一番上の回答(質問自体ではない)にあるものと同様の標準的な順列アルゴリズムを使用しています:文字列のC++再帰順列アルゴリズム->重複をスキップしない

たとえば、入力「ABC」の場合、出力は次のようになります。 ABC ACB BAC BCA CAB CBA

入力「ACC」の場合、次のようになります。 ACC CAC CCA

出力はすべて正しいですが、別の順序で必要です。入力は文字 'A' と 'C' のみで構成され、再帰関数に入力する前に文字列をアルファベット順に並べ替えているので、入力文字列は常に同じ文字 (つまり AACCC) になります。順序に関しては、「C」のコレクションを単一のエンティティとして扱いたいと思います。これは、最初の「C」の右側にある文字の順列のセットごとに左にシフトします。したがって、入力「ACC」の場合、最初の出力は「ACC」で問題ありません。すべての「C」を 1 ステップ左にシフトしたため、次の出力は「CCA」である必要があります。次に、すべての文字の「CCA」の順列最初の「C」の右側は最終出力で、「ACA」です。

これらの入力については、次のようにする必要があります。

入力: ACC

出力: ACC CCA CAC

入力: AACC

出力:

AACC ACCA ACAC CCAA CACA CAAC

この順序で組み合わせを生成するためにアルゴリズムを変更する方法はありますか?

4

1 に答える 1

0

2つの異なる文字を含む文字列Aの場合、'の数がC指定されている場合、探しているのはこれらのシーケンスの連結であるように聞こえます。正確に'で始まるすべての順列は逆辞書式順序で、すべての順列は正確には逆辞書式順序などです。したがって、辞書式順序の既存の出力を逆順で繰り返し、一致する要素を選択して、それらを新しいコレクションに追加することができます。nAn An-1 A/^A{n}C//^A{n-1}C//^A{0}C/

Aこの出力は、'sから0までの各長さの'sの文字列を生成し、各文字列n Aに対して、残りの文字の順列を辞書式順序の逆順に追加することで直接生成できます。

于 2012-11-10T22:00:02.373 に答える