文字列 S と、他の文字列のリスト L が与えられたとします。
S が L のすべての可能な連結の 1 つであるかどうかをどのように知ることができますか?
例えば:
S = "abcdabce"
L = ["abcd", "a", "bc", "e"]
S が "abcd" + "a" + "bc" + "e" の場合、S は L の連結ですが、"ababcecd" はそうではありません。
この質問を解決するために、DFS/バックトラッキングを使用しようとしました。擬似コードは次のとおりです。
boolean isConcatenation(S, L) {
if (L.length == 1 && S == L[0]) return true;
for (String s: L) {
if (S.startwith(s)) {
markAsVisited(s);
if (isConcatnation(S.exclude(s), L.exclude(s)))
return true;
markAsUnvisited(s);
}
}
return false;
}
ただし、DFS/バックトラッキングは効率的なソリューションではありません。この質問を解決するための最速のアルゴリズムは何か、またはそれをより高速に解決するための他のアルゴリズムがあるかどうかに興味があります。O(n) 時間で解決できる KMP のようなアルゴリズムがあることを願っています。