8

与えられた文字のセットのアナグラムを生成する私が作成しているプログラムでは、私の現在のアプローチは次のとおりです。

  1. すべての文字のすべての組み合わせを取得します
  2. 各組み合わせグループの順列を取得します
  3. 結果の順列をアルファベット順に並べ替えます
  4. 重複するエントリを削除する

私の質問は順列の数学に関するものです。重複するエントリを削除した後、残りのすべてのエントリを格納するために必要な配列サイズをフラットアウトで計算できるかどうか疑問に思っています(たとえば、順列式などと組み合わせて繰り返される文字の数を使用して)。

質問のあいまいさについてお詫び申し上げます。組み合わせと順列についてはまだ調査中です。組み合わせや順列についての理解が深まり、自分のプログラムに慣れたら(去年の夏の私の暇なプロジェクトでした)、目標を詳しく説明していきます。

4

2 に答える 2

1

n要素がありa[0]、1 つの要素のa[1]複製、別の要素の複製などを最大 まで持つ場合a[k]、個別の順列の総数 (複製まで) はn!/(a[0]! a[1]! ... a[k]!)です。

参考までに、興味があれば、グアバで書くことができます

Collection<List<Character>> uniquePermutations = 
  Collections2.orderedPermutations(Lists.charactersOf(string));

その結果、文字の一意の順列が得られ、重複やすべてが考慮されます。メソッドを呼び出すこともでき.size()ますし、実装を見てヒントを得ることもできます。(開示:私はGuavaに貢献しています。)

于 2012-05-02T06:10:31.000 に答える
0

すべての順列を生成することは本当に悪い考えです。たとえば、「オーバーフロー」という単語には40320の順列があります。したがって、単語の長さが長くなるにつれて、メモリ消費量は非常に高くなります。

あなたが解決しようとしている問題は、ある単語が別の単語のアナグラムであるかどうかを調べることに還元できると私は信じています。

次に、各文字が出現する回数(26タプルになります)を数え、これらのタプルを相互に比較することで、それを解決できます。

于 2012-05-02T07:00:22.163 に答える