我正在寻找一种有效的算法来进行字符串平铺。基本上,您会得到一个字符串列表,例如BCD
, CDE
, ABC
, A
,并且生成的平铺字符串应该是ABCDE
,因为BCD
与CDE
yielding对齐BCDE
,然后与ABC
yield final对齐ABCDE
。
目前,我正在使用一种稍微幼稚的算法,其工作原理如下。从一对随机字符串开始,比如BCD
and CDE
,我使用以下(在 Java 中):
public static String tile(String first, String second) {
for (int i = 0; i < first.length() || i < second.length(); i++) {
// "right" tile (e.g., "BCD" and "CDE")
String firstTile = first.substring(i);
// "left" tile (e.g., "CDE" and "BCD")
String secondTile = second.substring(i);
if (second.contains(firstTile)) {
return first.substring(0, i) + second;
} else if (first.contains(secondTile)) {
return second.substring(0, i) + first;
}
}
return EMPTY;
}
System.out.println(tile("CDE", "ABCDEF")); // ABCDEF
System.out.println(tile("BCD", "CDE")); // BCDE
System.out.println(tile("CDE", "ABC")); // ABCDE
System.out.println(tile("ABC", tile("BCX", "XYZ"))); // ABCXYZ
虽然这可行,但它不是很有效,因为它一遍又一遍地迭代相同的字符。
那么,有没有人知道更好(更有效)的算法来做到这一点?这个问题类似于 DNA 序列比对问题,因此非常欢迎该领域(当然还有其他人)提供任何建议。另请注意,我不是在寻找一个对齐,而是一个平铺,因为我需要一个字符串完全重叠在另一个上。
我目前正在寻找Rabin-Karp 算法的改编版本,以提高算法的渐近复杂度,但在进一步研究这个问题之前,我想听听一些建议。
提前致谢。
对于存在歧义的情况——例如,{ABC, CBA}
可能导致ABCBA
或CBABC
——,可以返回任何平铺。但是,这种情况很少发生,因为我正在平铺单词,例如{This is, is me} => {This is me}
,这些单词被操纵以便上述算法起作用。
类似问题:Efficient Algorithm for String Concatenation with Overlap