2012-08-04 3 views
1

comment trouver que deux chaînes sont cycliques ou non, en moins de O (n^2) et sans utiliser un troisième tableau.
entrée
str1 = "ABCDE" str = "eabcd"
sortie
cyclique
entrée
str1 = "cabdc" str = "ccabd"
sortie
cyclique
entrée
str1 = "ddabnhdd" str = "dddabnhd"
sortie
cyclique
trouver que deux chaînes sont

S'il vous plaît me suggérer la meilleure solution possible ???

+0

Voulez-vous vraiment dire moins de O (n^2)? O (n^2) n'est pas assez bon? – jahhaj

+0

O (n^2) n'est pas assez bon ... c'est pourquoi j'ai posté la question. –

+0

et clairement vous ne voulez pas accepter ma réponse O (n) sans-un-troisième tableau qui est juste. :( – lavin

Répondre

4

Vous devez faire une recherche de chaîne optimisée, il y en a qui prennent O(n) + O(m), vous pouvez les trouver here. Après cela, il suffit de doubler la première chaîne et de rechercher la seconde, cela prendra O(n) fois.
Pour éviter d'utiliser un troisième tableau, faites simplement tout accès à la première chaîne modulo n.

+0

Doubler la première chaîne est essentiellement la même chose que d'utiliser un troisième tableau, je pense: – jahhaj

+0

@jahhaj: regardez l'édition – Dani

+0

OK, mais toutes ces méthodes impliquent la construction d'une structure de données complexe afin d'accélérer la recherche. – jahhaj

3

La réponse devrait être: minimal-cyclic-shift

Le coût algorithme O (n) et aucun tableau supplémentaire du tout, et il trouve le décalage cyclique minimal de mot.

à l'aide, nous pouvons facilement vérifier:

int a=minLexCyc(str1),b=minLexCyc(str2),i,n=strlen(str1); 
for(i=0;i<n;i++){ 
     if(str1[(a+i)%n]!=str2[(b+i)%n]){ 
       cout<< "not cyclic"; 
       return ; 
     } 
} 
cout<< "cyclic"; 

PS: Je ne pense pas que toute solution qui comprend une chaîne de recherche partie répondra à l'exigence: sans utiliser une troisième rangée dans O (n). Alors peut-être que la solution à décalage cyclique minimal est la seule.

+0

Vous devriez vérifier que bot Les cordes h ont la même longueur pour éviter les surprises désagréables et les mauvais résultats possibles, mais bonne réponse (je ne savais pas que vous pouviez trouver le décalage cyclique minimal en O (n) sans un tableau supplémentaire, merci pour le lien). –

Questions connexes