web-dev-qa-db-fra.com

Trouvez toutes les sous-chaînes possibles de la manière la plus rapide

Pour la chaîne A = "abcd", la réponse doit être

{a,ab,abc,abcd,b,bc,bcd,c,cd,d} 

Pour trouver toutes les sous-chaînes, j'ai utilisé la méthode suivante

for (int i = 0; i < A.length(); i++) {
    for (int j = i+1; j <= A.length(); j++) {
        System.out.println(A.substring(i,j));
    }
}

Mais selon ma compréhension, la complexité va à O(N^2). Pouvons-nous le rendre plus rapide? J'ai fait référence à la question précédente et il y avait un lien pour arborescence de suffixes mais cela ne semble pas résoudre mon problème. La sortie que j'obtiens de l'arborescence des suffixes est

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

Quelqu'un peut-il m'aider à trouver le moyen le plus rapide de le faire? Quelque chose comme en temps linéaire?

24
user2228588

Vous ne pouvez pas créer de chaînes O(N^2) en mieux que O(N^2) temps. C'est une impossibilité mathématique. Même si la création d'une chaîne nécessitait une instruction, il s'agit toujours d'un calcul O(N^2).

Mis à part la complexité, je ne pense pas que votre code puisse être amélioré de manière significative.


Pouvons-nous le rendre plus rapide?

Probablement pas.

L'optimisation de ce morceau de code particulier est une activité futile. Puisque vous écrivez les chaînes sur la sortie standard, les performances réelles seront dominées par les frais généraux d'écriture des caractères ... et tout ce que le système d'exploitation fait avec la sortie.

34
Stephen C