a2つのソートされたベクトルとが与えられた場合、の合計といくつかの順列であり、一度ソートされると一意でbあるすべてのベクトルを見つけます。ab
次の方法で、求めるベクトルの1つを作成できます。
- ベクトル
aとベクトルの順列を取りbます。 - それらを合計してください
c[i]=a[i]+b[i]。 - 並べ替え
c。
一意のベクトルbのセット全体を生成する-順列のセットを見つけることに興味があります。c
例0:a='ccdd'および合計されたベクトルをb='xxyy'
与えます: 'cycydxdx'、、。:と
の順列が等しいことに注意してください。どちらの場合も、「ボックスc」と「ボックスd」の両方が正確に1つと1つを取得するためです。'cxcxdydy''cxcydxdy'b'xyxy''yxyx''x''y'
これは、ボールとボックスのいくつかのグループが同一であるボックス(それぞれに1つ)にMボールを入れることに似ていると思います。更新:文字列が与えられた場合、問題は4つのボックスに10個のボールになります。サイズ2、3、1、4の4つの異なるボックスがあります。ボールはペアごとに区別できません。M
a='aabbbcdddd'b='xxyyzzttqq'
例1:与えられた文字列はとa='xyy'ですb='kkd'。
考えられる解決策:'kkd'、'dkk'。
理由:のすべての一意の順列は、、bおよび'kkd'で'kdk'あることがわかり'dkk'ます。'y'ただし、私たちの制約により、最初の2つの順列は、異なる文字列の同じ文字にマップされるインデックスと等しいと見なされますa。
例2:与えられた文字列はとa='xyy'ですb='khd'。考えられる
解決策:'khd'、、'dkh'。'hkd'
例3:与えられた文字列はとa='xxxx'ですb='khhd'。
考えられる解決策:'khhd'。
Wikipedia / Permutationbで説明されているように、Narayana Panditaのアルゴリズムを使用して、一意の候補順列を生成する問題を解決できます。
2番目の部分はより硬く継ぎ目があります。私のベストショットは、2つの文字列をペアでリストに結合し、並べ替えて、ルックアップセットのキーとして使用することです。(+ join→<code>'xh'、'xd'sort→<code>'xd'、'xh')。'xx''hd'
私Mはしばしば非常に大きく、文字列の類似性が一般的であるため、現在b、実際にセットフィルターを通過するよりもはるかに多くの順列を生成します。正しいアルゴリズムを直接生成するアルゴリズムが欲しいです。どんな改善でも大歓迎です。