Comment trouver le plus long préfixe de palindrome d'une chaîne dans O (n)?Le plus long préfixe palindrome
Répondre
Solution pour un problème plus général, le préfixe mais pas sous-chaîne, en O (n):
http://www.akalin.cx/2007/11/28/finding-the-longest-palindromic-substring-in-linear-time/
second résultat sur Google pour "le plus long préfixe palindrome" ....
Ousolution en utilisant le suffixe arbres:
A la fonction 'fastLongestPalindromes (..)' sur le lien vers akalin.cx effectivement 'O (n)' pire cas complexité? Je vois deux boucles imbriquées .. –
N'ont pas tout lu mais 2 boucles imbriquées ne signifie pas complexité quadratique. La continuation au début de la fonction doit s'assurer que la boucle interne n'est exécutée que dans quelques cas et que la complexité globale de chaque exécution de cette boucle est O (n). –
Utilisez un rolling hash. Si a
est votre chaîne, laissez ha[x]
être le hachage des premiers caractères x
dans a
calculé de gauche à droite et laissez hr[x]
être le hachage des premiers caractères x
dans s
calculé de droite à gauche. Vous êtes intéressé par la dernière position i
pour laquelle hf[i] = hb[i]
.
code en C (utiliser deux hash pour chaque direction afin d'éviter les faux positifs):
int match = n - 1;
int ha1 = 0, ha2 = 0, hr1 = 0, hr2 = 0;
int m1 = 1, m2 = 1;
for (int i = 0; a[i]; ++i)
{
ha1 = (ha1 + m1*a[i]) % mod1;
ha2 = (ha2 + m2*a[i]) % mod2;
hr1 = (a[i] + base1*hr1) % mod1;
hr2 = (a[i] + base2*hr2) % mod2;
m1 *= base1, m1 %= mod1;
m2 *= base2, m2 %= mod2;
if (ha1 == hr1 && ha2 == hr2)
match = i;
}
Je pense que la partie 'de droite à gauche' n'est pas présente dans l'exemple de code ... ('i' va de gauche à droite et vous accédez seulement' a [i] '. –
@Andre Holzner -' Je vais seulement de gauche à droite: à chaque pas de 'i', vous aurez la longueur du préfixe palindromique actuel le plus long stocké dans' match', c'est seulement les hashs qui roulent dans les deux sens – IVlad
+1, je n'ai pas Je sais que ça s'appelait 'rolling hash', mais même deux hashes ne garantissent pas que chaque positif soit 'vrai' (sans parler de ces coefficients inhabituels :)). Simplement parce que pour une certaine longueur _n_ il y a plus de chaînes de caractères n que de paires différentes de nombres entiers _ (ha1, ha2) _. Et si vous faites la vérification de chaque positif, vous obtenez O (n^2) sur une chaîne uniforme ('aaaaaaaa ...'). –
- 1. le plus long préfixe correspondant
- 2. Comment trouver le plus long palindrome d'une chaîne donnée?
- 3. Comment choisir le centre suivant dans le plus long algorithme de palindrome?
- 4. cookie le plus long
- 5. Palindrome - enlever le goto
- 6. Algorithmes pour trouver le plus long préfixe commun dans une fenêtre glissante
- 7. Algorithme/étapes pour trouver plus long préfixe de recherche dans Patricia Trie
- 8. Le plus long élément du tableau
- 9. Algorithme pour trouver l'anagramme le plus long
- 10. Programme pour vérifier un Palindrome
- 11. Le chemin le plus long dans le code Java
- 12. Palindrome Utilisation d'une pile
- 13. Création d'un programme pour trouver le chemin le plus long
- 14. Comment trouver le mot le plus long avec python?
- 15. le mot de code huffman le plus long
- 16. Vérifiez pair/impair pour Palindrome?
- 17. Efficacité de la détection Palindrome
- 18. SQL: recherche de l'intervalle de date le plus long
- 19. Split By le plus long CORRESPONDANCE REGEX Substring
- 20. le point peut-il avoir un historique plus long?
- 21. Jquery: Obtenir la largeur du H2 qui contient le plus de caractères/est le plus long
- 22. Traiter un processus plus long dans WCF
- 23. Equivalent de + = pour le préfixe
- 24. jQuery - comment annuler le préfixe
- 25. Vérification de la chaîne palindrome dans c
- 26. Palindrome en C sans pointeurs et récursion
- 27. C#: Modifiez le format Jour avec le zéro le plus long dans le DateTime
- 28. Vérificateur de palindrome basé sur une pile
- 29. Création d'une liste palindrome avec reverse()
- 30. Optimisations pour le problème de chemin le plus long dans le graphe cyclique
Cela ressemble à une question de devoirs. Si c'est le cas, il devrait être étiqueté comme tel. –
Définit le préfixe de palindrome le plus long. Et le temps devrait-il être lié par O (n) ou la mémoire aussi? Et est ce devoir? –
Je pense que cette réponse est un toyota –