Tôi đang tìm một thuật toán hiệu quả để làm ốp lát. Về cơ bản, bạn được cung cấp một danh sách các chuỗi, nói BCD
, CDE
, ABC
, A
, và kết quả lát gạch chuỗi nên ABCDE
, vì BCD
thẳng hàng với CDE
năng suất BCDE
, đó là sau đó căn chỉnh với ABC
cho kết quả cuối cùng là ABCDE
.Thuật toán ốp lát chuỗi
Hiện tại, tôi đang sử dụng thuật toán hơi ngây thơ, hoạt động như sau. Bắt đầu với một cặp ngẫu nhiên của chuỗi, nói BCD
và CDE
, tôi sử dụng sau đây (trong 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
Mặc dù công trình này, nó không phải là rất hiệu quả, vì nó lặp qua các nhân vật tương tự hơn và hơn nữa.
Vì vậy, không ai biết thuật toán tốt hơn (hiệu quả hơn) (hiệu quả hơn) để thực hiện điều này? Vấn đề này tương tự như một vấn đề liên kết chuỗi DNA, vì vậy mọi lời khuyên từ một người nào đó trong lĩnh vực này (và những người khác, tất nhiên) đều được chào đón rất nhiều. Ngoài ra, xin lưu ý rằng tôi không tìm kiếm một liên kết , nhưng một lát là ốp lát, bởi vì tôi yêu cầu chồng chéo đầy đủ một trong các chuỗi so với chuỗi kia.
Tôi hiện đang tìm kiếm sự thích ứng của Rabin-Karp algorithm, để cải thiện độ phức tạp tiệm cận của thuật toán, nhưng tôi muốn nghe một số lời khuyên trước khi giải quyết thêm bất kỳ vấn đề nào.
Xin cảm ơn trước.
Đối với trường hợp có sự mơ hồ - ví dụ, {ABC, CBA}
mà có thể dẫn đến ABCBA
hoặc CBABC
-, bất kỳ ốp lát có thể được trả lại. Tuy nhiên, tình trạng này hiếm khi xảy ra, bởi vì tôi đang tiling từ, ví dụ {This is, is me} => {This is me}
, được điều khiển để thuật toán nói trên hoạt động.
tương tự câu hỏi: Efficient Algorithm for String Concatenation with Overlap
+1 cho một câu hỏi hay (nhưng thực sự để tìm khóa 'ï' 8-) – RichieHindle
Phím ï trong OS X là 'Alt + u' để nhận được âm sắc theo sau là' i' mà nó được áp dụng. –
Rất gần với http://stackoverflow.com/questions/1285434/efficient-algorithm-for-string-concatenation-with-overlap. –