如何删除字符串中所有指定子串(含重叠匹配情况)
问题:删除字符串中所有重叠的模式子串
比如源字符串为"appleappleapplebanana",要删除的模式串是"appleapple"。要求删掉所有重叠的该子串,最终只保留"banana"。
appleappleapplebanana ^^^^^^^^^^ <-first occurrence ^^^^^^^^^^ <-second occurrence
用replaceAll方法得到的结果是"applebanana",因为它会先删除第一个匹配的子串,剩余的"applebanana"里无法再匹配到第二个重叠的模式串,不符合需求。
预期结果
| 输入 | 模式 | 结果 |
|---|---|---|
"appleapplebanana" | "appleapple" | "banana" |
"appleapplebanana" | "appleapple" | "banana" |
"appleappleapplebanana" | "appleapple" | "banana" |
"applebanana" | "appleapple" | "applebanana" |
"aaabbbaaabbbaaa" | "aaabbbaaa" | ""(空字符串) |
由于需要处理任意输入的模式,仅靠replace("apple")这类针对性替换完全无法满足需求。
我自己梳理的实现思路:
- 找出所有模式串的匹配位置(比如用KMP算法)
- 将这些位置对应的字符标记为“待删除”
- 最终删除所有标记的字符
原本想找现成的更优方案,但发现没有通用类库支持该功能,最后还是基于上述思路自行实现了相关函数。
内容的提问来源于stack exchange,提问作者Sig
相关产品推荐
相关产品推荐

