Я ищу эффективный алгоритм для разбиения строк . По сути, вам предоставляется список строк, скажем BCD
, CDE
, ABC
, A
и результирующая строка tiled должна быть 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
Несмотря на то, что это работает, это не очень эффективно, поскольку оно повторяет одни и те же символы снова и снова.
Итак, кто-нибудь знает лучший (более эффективный) алгоритм для этого ? Эта проблема похожа на проблему выравнивания последовательностей ДНК, поэтому любые советы от кого-то в этой области (и других, конечно) очень приветствуются. Также обратите внимание, что я не ищу выравнивание , а tiling , потому что мне требуется полное перекрытие одной из строк над другой.
В настоящее время я ищу адаптацию алгоритма Рабина-Карпа , чтобы улучшить асимптотическую сложность алгоритма, но я хотел бы услышать несколько советов, прежде чем углубляться в это вопрос.
Заранее спасибо.
Для ситуаций, где есть неоднозначность - например, {ABC, CBA}
, которая может привести к ABCBA
или CBABC
-, любой тайлинг может быть возвращен. Однако такая ситуация встречается редко, потому что я выкладываю слова, например {This is, is me} => {This is me}
, которыми манипулируют так, чтобы вышеупомянутый алгоритм работал.
Аналогичный вопрос: Эффективный алгоритм объединения строк с перекрытием