たとえば、文字列A = "abcd" 答えは{a、ab、abc、abcd、b、bc、bcd、c、cd、d}にする必要がありますすべては、私は方法可能なすべての部分文字列を見つける方法
for (int i = 0; i < A.length(); i++) {
for (int j = i+1; j <= A.length(); j++) {
System.out.println(A.substring(i,j));
}
}
しかし、それはN^2に行く私の理解によると、私たちが作ることができ、以下に使用したすべての部分文字列を検索するに
)...サブと呼ばれるかどうかが、私はそうと仮定していますされていますそれは速く私は過去の質問を参照してサフィックスツリーhttp://allisons.org/ll/AlgDS/Tree/Suffix/のリンクがあったが、それは私の問題を解決するようだ....サフィックスツリーから得る出力は{1:abcdです 2:bcd 3:cd 4:d} これを行う最速の方法を見つけるのに手伝ってください。線形時間のようなものですか?事前に感謝.....
O(n^2)のような部分文字列があるので、可能性のある部分文字列の開始点と終了点をリストすることもできます。各部分文字列を完全に印刷したい場合は、文字列全体の長さに比例した時間がかかるため、時間の複雑さはO(n^3)まで上がります。 –
また、空の文字列も有効な部分文字列であることに注意してください。 – Philip
すべてに「触れない」部分文字列を使ってクエリを実行しようとすると、より高速にすることができます。それらを印刷すると、それらのすべてに触れます。 「少なくとも2回出現する最長の部分文字列は何ですか」、または「k文字以上の部分文字列が最も頻繁に出現する部分」は、すべての部分文字列(接尾辞ツリー付き)を列挙することなく指定できます。 – harold