【发布时间】:2009-09-17 20:41:41
【问题描述】:
我正在寻找一种有效的算法来进行字符串平铺。基本上,你会得到一个字符串列表,比如 BCD、CDE、ABC、A ,结果 tiled 字符串应该是 ABCDE,因为 BCD 与 CDE 对齐产生 BCDE,然后与 @ 对齐987654332@ 产生最终的ABCDE。
目前,我正在使用一种稍微幼稚的算法,其工作原理如下。从一对随机字符串开始,比如BCD 和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 序列比对问题,因此非常欢迎该领域(当然还有其他人)提供任何建议。另请注意,我不是在寻找 alignment,而是在寻找 tiling,因为我需要一个字符串完全重叠在另一个字符串上。
我目前正在寻找 Rabin-Karp algorithm 的改编版,以提高算法的渐近复杂度,但在进一步研究此问题之前,我想听听一些建议。
提前致谢。
对于存在歧义的情况 - 例如,{ABC, CBA} 可能导致 ABCBA 或 CBABC - 可以返回任何平铺。但是,这种情况很少发生,因为我正在平铺单词,例如{This is, is me} => {This is me},它们被操纵以使上述算法起作用。
类似问题:Efficient Algorithm for String Concatenation with Overlap
【问题讨论】:
-
+1 表示写得很好的问题(但实际上是为了找到
ï键 8-) -
OS X 中的 ï 键是
Alt+u以获取元音变音符号,然后是应用它的i。