web-dev-qa-db-ja.com

可能なすべての部分文字列を最速で見つける

文字列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));
    }
}
_

しかし、私の理解によれば、複雑さはO(N^2)に行きます。もっと速くできますか?私は前の質問を参照しました、そして suffix tree へのリンクがありましたが、それは私の問題を解決していないようです。接尾辞ツリーから得られる出力は

_{
 1: abcd
 2: bcd
 3: cd
 4: d
} 
_

これを行う最速の方法を見つけるのを手伝ってくれる人はいますか?線形時間のようなものですか?

24
user2228588

O(N^2)文字列をO(N^2)時間よりも適切に作成することはできません。それは数学的に不可能です。文字列の作成に1つの命令があったとしても、それはO(N^2)の計算です。

複雑さはさておき、私はあなたのコードを大幅に改善できるとは思いません。


もっと速くできますか?

おそらく違います。

この特定のコードを最適化することは無駄な活動です。文字列を標準出力に書き込むので、実際のパフォーマンスは、文字を書き込むオーバーヘッドと、OSが出力に対して行うことによって支配されます。

34
Stephen C