मैं स्ट्रिंग टाइलिंग करने के लिए एक कुशल एल्गोरिदम खोज रहा हूं। मूल रूप से, आप स्ट्रिंग की एक सूची दी गई है, का कहना है कि BCD
, CDE
, ABC
, A
, और जिसके परिणामस्वरूप टाइलों स्ट्रिंग ABCDE
होना चाहिए, क्योंकि BCD
CDE
उपज BCDE
है, जो के साथ संरेखित फिर ABC
के साथ अंतिम ABCDE
उपज के साथ गठबंधन किया गया।स्ट्रिंग टाइलिंग एल्गोरिदम
वर्तमान में, मैं थोड़ा सा भद्दा एल्गोरिदम का उपयोग कर रहा हूं, जो निम्नानुसार काम करता है। तार के एक यादृच्छिक जोड़ी के साथ शुरू, BCD
और CDE
कहता हूँ, मैं का उपयोग करें (जावा में) के बाद:
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
हालांकि यह काम करता है, यह बहुत ही कुशल नहीं है, के रूप में यह बार-बार एक ही से अधिक अक्षर iterates।
तो, क्या कोई बेहतर (अधिक कुशल) एल्गोरिदम यह करने के लिए जानता है? यह समस्या एक डीएनए अनुक्रम संरेखण समस्या के समान है, इसलिए इस क्षेत्र में किसी से भी सलाह (और अन्य, निश्चित रूप से) बहुत स्वागत है। यह भी ध्यान रखें कि मैं संरेखण की तलाश नहीं कर रहा हूं, लेकिन टाइलिंग कर रहा हूं, क्योंकि मुझे दूसरे पर तारों में से एक के पूर्ण ओवरलैप की आवश्यकता है।
मैं वर्तमान में Rabin-Karp algorithm का एल्गोरिदम की एसिम्प्टोटिक जटिलता में सुधार करने के लिए अनुकूलन की तलाश में हूं, लेकिन मैं इस मामले में आगे बढ़ने से पहले कुछ सलाह सुनना चाहता हूं।
अग्रिम धन्यवाद। उदाहरण के लिए, {ABC, CBA}
जिसमें ABCBA
या CBABC
परिणाम सकता है - -, किसी भी खपरैल वापस किया जा सकता
स्थितियों के लिए जहां अस्पष्टता नहीं है। हालांकि, यह स्थिति शायद ही कभी होती है, क्योंकि मैं शब्दों को टाइल कर रहा हूं, उदा। {This is, is me} => {This is me}
, जो छेड़छाड़ की जाती है ताकि उपर्युक्त एल्गोरिदम काम करता है।
इसी प्रकार के प्रश्न: Efficient Algorithm for String Concatenation with Overlap
+1 एक अच्छी तरह से लिखित प्रश्न के लिए +1 (लेकिन वास्तव में 'ï' कुंजी 8-) – RichieHindle
ओएस एक्स में आई कुंजी' उल्ट + यू 'है जिसे' i' ' लागू है। –
http://stackoverflow.com/questions/1285434/efficient-algorithm-for-string-concatenation-with-overlap के बहुत करीब है। –