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