我正在寻找一种高效的算法来进行字符串平铺。基本上,您将获得一组字符串,例如
目前,我正在使用一个稍微朴素的算法,它的工作方式如下。从随机一对字符串开始,比如
尽管这个方法可行,但效率不高,因为它一遍又一遍地迭代相同的字符。
那么,有没有更好(更有效)的算法可以解决这个问题?这个问题类似于DNA序列对齐问题,所以来自该领域(当然还有其他领域)的任何建议都非常欢迎。请注意,我不是在寻找一种对齐,而是一种平铺,因为我需要一个字符串完全重叠在另一个字符串上。
我目前正在寻找Rabin-Karp算法的改编,以提高算法的渐近复杂度,但在深入研究此问题之前,我想听听一些建议。
提前感谢您。
针对存在不确定性的情况,例如
类似问题:高效字符串重叠拼接算法
BCD
、CDE
、ABC
、A
,生成的平铺字符串应为ABCDE
,因为BCD
与CDE
对齐产生BCDE
,然后与ABC
对齐产生最终的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序列对齐问题,所以来自该领域(当然还有其他领域)的任何建议都非常欢迎。请注意,我不是在寻找一种对齐,而是一种平铺,因为我需要一个字符串完全重叠在另一个字符串上。
我目前正在寻找Rabin-Karp算法的改编,以提高算法的渐近复杂度,但在深入研究此问题之前,我想听听一些建议。
提前感谢您。
针对存在不确定性的情况,例如
{ABC, CBA}
可能会得到ABCBA
或CBABC
等结果,任何切割方式都可以被接受。然而这种情况很少发生,因为我在处理单词时会进行操作,例如{This is, is me} => {This is me}
,以保证上述算法能够正常运行。类似问题:高效字符串重叠拼接算法
ï
键 8-) - RichieHindleAlt+u
键,然后再输入要添加该字符的字母 i。 - Hank Gay