文字列タイリングを行う効率的なアルゴリズムを探しています。基本的に、文字列のリスト ( 、 、 、 など) が与えられ、BCD
結果CDE
のABC
タイルA
化された文字ABCDE
列はになるはずです。BCD
CDE
BCDE
ABC
ABCDE
現在、私は次のように動作する少し素朴なアルゴリズムを使用しています。文字列のランダムなペアから始めて、たとえばBCD
and 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
orになる可能性がある) のCBABC
場合、任意のタイルを返すことができます。ただし、このような状況はめったに発生しません{This is, is me} => {This is me}
。これは、前述のアルゴリズムが機能するように操作された単語をタイリングしているためです。