セット{0,1}内の要素のすべての可能な組み合わせで構成されるセットE*から111が1回だけ出現する文字列を作成するにはどうすればよいですか?
2 に答える
次の手順に基づいて一連の文字列を生成できます。
いくつかの数字のチャックとその正当な位置が列挙されています:
開始: 110
どこにでもある必要があります: 111
どこでも: 0, 010, 0110
終了: 011
ターゲット文字列の長さに依存 (長さは 3 より大きくする必要があります)
条件 1: 長さ = 3 : {111}
条件 2: 6 > 長さ > 3 : (長さ-3) = 1x + 3y + 4z
たとえば、長さが 5 の場合: 答えは (2,1,0) と (1,0,1) です。
(2,1,0) -> 2 つの '0' と 1 つの '010' -> ^0^010^ または ^010^0^ (111 は ^ でマークされた任意の場所に配置できます)
(1,0,1) -> 1 つの '0' と 1 つの '0110' ...
条件 3: 9 > 長さ > 6 の場合、次の 2 つの式の解を考慮する必要があります。
コメント:
長さ – 3 : 111 を除く長さ
x: 0 が発生した回数
y: 010 が発生した回数
z: 0110 が発生した時刻
すべての解を見つける {(x,y,z) | 1x + 3y + 4z = (長さ - 3)} ----(1)
ソリューションごとに、1 つ以上の修飾文字列を生成できます。たとえば、長さ 10 の文字列を生成する場合、(x,y,z) の 1 つの解は (0,2,1) であり、これは、'010' が 2 回発生し、'0110' が 1 回発生する必要があることを意味します。このソリューションに基づいて、次の文字列を生成できます。
0: x0 回
010:×2回
0110: x1回
111:×1回(必須)
上記の要素の順列を見つける。010-0110-010-111 または 111-010-010-0110 …</p>
(長さ - 6) = 1x + 3y + 4z ---(2) 上記の場合と同様に、すべての順列を見つけて中間文字列を形成します。最後に、中間文字列 Istr ごとに、Istr + 011 または 110 + Istr の両方が修飾されます。
たとえば、(10-6) = 1*0 + 3*0 + 4*1 または = 1*1 + 3*1 + 4*0
中間文字列は、answer(0,0,1) に対して 1 つの '0110' で構成できます: ^0110^011 と 110^0110^ は修飾文字列です (111 は ^ としてマークされた任意の場所に配置できます)。
または、中間文字列を 1 つの '0' と 1 つの '010' で構成して、回答 (1,1,0) にすることもできます。
中間文字列は 0 010 または 010 0 にすることができます ^0010^011 および 110^0100^ は修飾文字列です (111 は ^ としてマークされた任意の場所に配置できます)
条件 4: 長さ > 9 の場合、加算式を考慮する必要があります。
(長さ – 9) = 1x + 3y + 4z
上記の場合と同様に、すべての順列を見つけて中間文字列を形成します。最後に、中間文字列 Istr ごとに、110 + Istr + 011 が修飾されます。
説明:
私が使用するロジックは、組み合わせ数学に基づいています。ターゲット文字列は、1 つ以上の部分文字列の組み合わせとして表示されます。制約 ('111' はターゲット文字列に 1 回だけ出現する) を満たすには、部分文字列に基準を設定する必要があります。'111' は間違いなく 1 つの部分文字列であり、1 回しか使用できません。他の部分文字列は、'111' の 1 回限りの制約に違反することを防ぎ、可能なすべてのターゲット文字列を生成するのに十分一般的である必要があります。
only-one-111 を除いて、他の部分文字列には 2 つ以上の隣接する '1' があってはなりません。('111'、'1111'、'11111' のように、他の部分文字列に 2 つ以上の隣接する 1 がある場合、部分文字列には不要な '111' が含まれるため)。only-one-111 を除いて、他の部分文字列には 2 つ以上連続する「1」があってはなりません。'111'、'1111'、'11111' など、他の部分文字列に 1 が 2 つ以上連続する場合、部分文字列には不要な '111' が含まれます。ただし、部分文字列 '1' および '11' は、111 個のみの制約を保証できません。たとえば、'1'+'11'、'11'+'11' または '1'+'1'+'1' にはすべて不要な '111' が含まれています。不要な「111」を避けるために、「0」を追加する必要があります さらに隣接する '1' を停止します。その結果、修飾された 3 つの部分文字列 '0'、'010'、および '0110' が生成されます。修飾された 3 つの部分文字列から作成された結合文字列には、'111' のゼロ回が含まれます。
上記の 3 つの修飾部分文字列は、ターゲット文字列に「111」が追加されないことを 100% 保証するため、ターゲット文字列のどこにでも配置できます。
部分文字列の位置が先頭または末尾にある場合、「111」を防ぐために「0」を 1 つだけ使用できます。
はじめに:
10xxxxxxxxxxxxxxxxxxxxxxxxxxx
110xxxxxxxxxxxxxxxxxxxxxxxxxxx
最後に:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx011
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx01
これらの 2 つのケースでは、「111」が追加されないようにすることもできます。
上記のロジックに基づいています。'111' を 1 つだけ使用して、任意の長さのターゲット文字列を生成できます。
あなたの質問はより明確になる可能性があります。
1 つには、 1 つまたは 2"1111"
つのオカレンスが含まれています"111"
か?
その場合、またはを含む"111"
が含まないすべての文字列が必要です。そうでない場合は、 のテストを省略します。"1111"
"111.*111"
"1111"
私の理解が正しければ、あなたは 0 と 1 のシーケンスの無限セットの無限サブセットを構築しようとしています。それをどのように行うかは、おそらく使用している言語によって異なります (ほとんどの言語には、無限集合を表す方法がありません)。
私の最善の推測は、0 と 1 のすべてのシーケンスのシーケンスを生成し (これはそれほど難しくないはずです)、基準を満たすものを選択することです。