我不确定这个问题是否仍然有人感兴趣,但我有一个想法可能可行。
一旦我们决定问题不在于找到子字符串,而是决定从字符串 A 中删除哪个字母更方便,对我来说解决方案似乎很简单:如果您发现 B 字符串出现在 A 中,最好的办法是可以做的只是删除字符串内的一个字符,靠近右键……让我们说最后一个。这就是为什么如果你有一个实际上结束它的开始方式的子字符串,如果你在开头删除一个字符,你只删除一个 B 出现,而你实际上可以一次删除两个。
伪 cos 中的算法:
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 在开始时没有结束,所以它进入第二个循环:
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 = "abccccccccc" B = "abc"
第一次出现在 occ_posit = 1。B 开始时并没有结束,所以它进入第二个循环:
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 =“accccccccc”
让我们尝试重叠:
A = "abcdabcdabff" B = "abcdab"
该算法导致: A = "abcdacdabff" 不再出现。
最后,一个字母重叠:
A = “阿巴巴巴巴” B = “阿巴”
B 在它开始时结束,所以它进入第一个 if:
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° step: A= "abbbbabbabba" 2° step: A= "abbbbabbbba" 我们就完成了。
希望这可以帮助
编辑:请注意,当您的搜索接近 A 端时,必须稍微更正 algotirhm 以免出错,但这只是一个简单的编程问题。