この質問がまだ誰かの興味を引いているかどうかはわかりませんが、うまくいくかもしれないという考えがあります。
問題は部分文字列を見つけることではなく、文字列 A からどの文字を削除するのがより便利かを判断することであると判断したら、解決策は非常に単純に見えます。できることは、文字列内にあり、右側のボンダリに閉じている文字を削除することです...最後の前のものとしましょう。そのため、実際に開始方法を終了する部分文字列がある場合、最初の char を削除すると、B 出現の 1 つを削除するだけで、実際には一度に 2 つを削除できます。
疑似 cose のアルゴリズム:
String A, B;
int occ_posit = 0;
N = B.length();
occ_posit = A.getOccurrencePosition(B); // pseudo function that get the first occurence of B into A and returns the offset (1° byte = 1), or 0 if no occurence present.
while (occ_posit > 0) // while there are B into A
{
if (B.firstchar == B.lastchar) // if B starts as it ends
{
if (A.charat[occ_posit] == A.charat[occ_posit+1])
A.remove[occ_posit - 1]; // no reason to remove A[occ_posit] here
else
A.remove[occ_posit]; // here we remove the last char, so we could remove 2 occurencies at the same time
}
else
{
int x = occ_posit + N - 1;
while (A.charat[x + 1] == A.charat[x])
x--; // find the first char different from the last one
A.remove[x]; // B does not ends as it starts, so if there are overlapping instances they overlap by more than one char. Removing the first that is not equal to the char following B instance, we kill both occurrencies at once.
}
}
例を挙げて説明しましょう:
A = "123456789000987654321" B = "890"
これを表として読んでください:
occ_posit: 123456789012345678901
A = "123456789000987654321"
B = "890"
最初のオカレンスは occ_posit = 8 です。B は開始時に終了しないため、2 番目のループに入ります。
int x = 8 + 3 - 1 = 10;
while (A.charat[x + 1] == A.charat[x])
x--; // find the first char different from the last one
A.remove[x];
while は、A.charat11 が A.charat[10] (="0") と一致することを検出するため、x は 9 になり、while は A.charat[10] が A.charat9 と一致しないため終了します。A は次のようになります。
A = "12345678000987654321"
それ以上のオカレンスはありません。
別のものを試してみましょう: A = "abcccccccccc" B = "abc"
最初のオカレンスは occ_posit = 1 です。B は開始時に終了しないため、2 番目のループに入ります。
int x = 1 + 3 - 1 = 3;
while (A.charat[x + 1] == A.charat[x])
x--; // find the first char different from the last one
A.remove[x];
while は A.charat4 が A.charat[3] (="c") と一致することを検出するため、x は 2 になり、while は A.charat[3] が A.charat2 と一致しないため終了します。A は次のようになります。
A = "acccccccccc"
オーバーラップを試してみましょう:
A = "abcdabcdabff" B = "abcdab"
アルゴリズムの結果は次のとおりです。
最後に、1 つの文字が重なっています。
A = "アバババババ" B = "アバ"
B は開始時に終了するため、次の場合に最初に入ります。
if (A.charat[occ_posit] == A.charat[occ_posit+1])
A.remove[occ_posit - 1]; // no reason to remove A[occ_posit] here
else
A.remove[occ_posit]; // here we remove the last char, so we could remove 2 occurencies at the same time
これにより、B インスタンスの最後の「a」を削除できます。そう:
1° ステップ: A= "abbbbabbbba" 2° ステップ: A= "abbbbabbbba" これで完了です。
お役に立てれば
編集:検索でAの終わりに近づいたときにエラーが発生しないように、アルゴリズムを少し修正する必要があることに注意してください。ただし、これは簡単なプログラミングの問題です。