par exemple "ccddcc" dans la chaîne "abaccddccefe"
J'ai pensé à une solution mais elle fonctionne en temps O (n ^ 2)
Algo 1:
Étapes: c'est une méthode de force brute
- Avoir 2 boucles
for pour i = 1 à i inférieur à array.length -1
pour j = i + 1 à j inférieur à array.length - De cette façon, vous pouvez obtenir une sous-chaîne de toutes les combinaisons possibles à partir du tableau
- Avoir une fonction palindrome qui vérifie si une corde est palindrome
- donc pour chaque sous-chaîne (i, j) appelez cette fonction, s'il s'agit d'un palindrome, stockez-la dans une variable chaîne
- Si vous trouvez la sous-chaîne palindrome suivante et si elle est supérieure à la sous-chaîne actuelle, remplacez-la par la sous-chaîne actuelle.
- Enfin votre variable chaîne aura la réponse
Problèmes: 1. Cet algorithme s'exécute en temps O (n ^ 2).
Algo 2:
- Inversez la chaîne et stockez-la dans un tableau différent
- Recherchez maintenant la plus grande sous-chaîne correspondante entre le tableau
- Mais cela fonctionne aussi en temps O (n ^ 2)
Pouvez-vous penser à un algo qui fonctionne dans un meilleur temps. Si possible O (n) fois
algorithm
palindrome
Apprenant
la source
la source
O(n^2)
d'obtenir les sous-chaînes *O(n)
pour vérifier si ce sont des palindromes, pour un total deO(n^3)
?Réponses:
Vous pouvez trouver le plus long palindrome en utilisant l'algorithme de Manacher dans le
O(n)
temps! Sa mise en œuvre peut être trouvée ici et ici .Pour l'entrée,
String s = "HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE"
il trouve la sortie correcte qui est1234567887654321
.la source
while
intégré dans lefor
avec une délimitation qui semble similaire à la boucle externe.L'Algo 2 peut ne pas fonctionner pour toutes les cordes. Voici un exemple d'une telle chaîne "ABCDEFCBA".
Non pas que la chaîne ait "ABC" et "CBA" comme sous-chaîne. Si vous inversez la chaîne d'origine, ce sera "ABCFEDCBA". et la plus longue sous-chaîne correspondante est "ABC" qui n'est pas un palindrome.
Vous devrez peut-être vérifier en plus si cette sous-chaîne correspondante la plus longue est en fait un palindrome dont le temps d'exécution est O (n ^ 3).
la source
Pour autant que j'ai compris le problème, nous pouvons trouver des palindromes autour d'un index central et étendre notre recherche dans les deux sens, à droite et à gauche du centre. Compte tenu de cela et sachant qu'il n'y a pas de palindrome aux coins de l'entrée, nous pouvons définir les limites à 1 et longueur-1. Tout en faisant attention aux limites minimum et maximum de la chaîne, nous vérifions si les caractères aux positions des index symétriques (droite et gauche) sont les mêmes pour chaque position centrale jusqu'à ce que nous atteignions notre centre de limite supérieure maximum.
La boucle externe est O (n) (max n-2 itérations), et la boucle while interne est O (n) (max autour de (n / 2) - 1 itérations)
Voici mon implémentation Java en utilisant l'exemple fourni par d'autres utilisateurs.
Le résultat de ceci est le suivant:
la source
expandAroundCenter
.avec regex et ruby, vous pouvez rechercher des palindromes courts comme ceci:
la source
J'ai écrit le programme Java suivant par curiosité, HTH simple et explicite. Merci.
la source
On m'a posé cette question récemment. Voici la solution que j'ai [finalement] trouvée. Je l'ai fait en JavaScript car c'est assez simple dans ce langage.
Le concept de base est que vous parcourez la chaîne à la recherche du plus petit palindrome à plusieurs caractères possible (un à deux ou trois caractères). Une fois que vous avez cela, élargissez les frontières des deux côtés jusqu'à ce qu'il cesse d'être un palindrome. Si cette longueur est plus longue que la plus longue actuelle, enregistrez-la et avancez.
Cela pourrait certainement être nettoyé et optimisé un peu plus, mais il devrait avoir de très bonnes performances dans tous les scénarios sauf dans le pire des cas (une chaîne de la même lettre).
la source
i
j
l
s
if
maintenance. multi return points, edge cases ...Salut Voici mon code pour trouver le palindrome le plus long de la chaîne. Veuillez vous référer au lien suivant pour comprendre l'algorithme http://stevekrenzel.com/articles/longest-palnidrome
Les données de test utilisées sont HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE
la source
Voir l'article de Wikipédia sur ce sujet. Exemple d' implémentation Java de l' algorithme de Manacher pour la solution linéaire O (n) de l'article ci-dessous:
source
Une
Regexp
solution efficace qui évite la force bruteCommence par toute la longueur de la chaîne et fonctionne vers le bas jusqu'à 2 caractères, existe dès qu'une correspondance est faite
Pour
"abaccddccefe"
les tests d'expression régulière, 7 correspondances avant de revenirccddcc
.vbs
vba
fonction
source
source
Essayez la chaîne - "HYTBCABADEFGHABCDEDCBAGHTFYW123456789987654321ZWETYGDE"; Cela devrait fonctionner pour les copains pairs et impairs. Un grand merci à Mohit!
en utilisant l'espace de noms std;
source
isPal
- une opération O (n) - uniquement pour mesurer sa longueur !? Il a également une tentative de buggy pour gérer même les palindromes. Sur la bugginess même-palindrome:else if(input_str[i] == input_str[j])
ne peut jamais réussir parce que ce même test doit avoir échoué dans laif
déclaration précédente ; et c'est bogué de toute façon parce que vous ne pouvez pas dire simplement en regardant 2 caractères espacés de 2 positions si vous regardez un palindrome pair ou impair (considérezAAA
etAAAA
).Le code suivant calcule Palidrom pour les chaînes de longueur paire et impaire.
Ce n'est pas la meilleure solution mais fonctionne pour les deux cas
HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE
source
Nous pouvons trouver tous les palindromes de toute longueur en utilisant ceci.
Échantillon :
mot = abcdcbc
modifiedString = a # b # c # d # c # b # c
palinCount = 1010105010301
longueur du palindrome le plus long = 5;
palindrome le plus long = bcdcb
classe publique MyLongestPalindrome {
}
la source
Cela retournera la plus longue chaîne de palindrome de la chaîne donnée
== SORTIE ===
Entrée: abcccde Sortie: ccc
Entrée: abcccbd Sortie: bcccb
Entrée: abedccde Sortie: edccde
Entrée: abcccdeed Sortie: acte
Entrée: abcccbadeed Sortie: abcccba
la source
Voici une implémentation en javascript:
la source
Pour une solution linéaire, vous pouvez utiliser l'algorithme de Manacher. Il existe un autre algorithme appelé Algorithme de Gusfield, et ci-dessous le code en java:
Vous pouvez en savoir plus sur d'autres solutions telles que la meilleure solution O (n ^ 2) ou l'algorithme de Manacher sur mon propre blog .
la source
Ici, j'ai écrit une logique, essayez-le :)
la source
Cette solution est de complexité O (n ^ 2). O (1) est la complexité spatiale.
la source
{'DED': 3, '123456789987654321': 18, '67899876': 8, 'ABCDEDCBA': 9, '456789987654': 12, '34567899876543': 14, 'BCDEDCB': 7, 'ABA': 3, ' 5678998765 ': 10,' 2345678998765432 ': 16,' CDEDC ': 5,' 789987 ': 6,' 8998 ': 4} (' 123456789987654321 ', 18)
la source
Voici mon algorithme:
1) définir le centre actuel comme première lettre
2) développez simultanément vers la gauche et la droite jusqu'à ce que vous trouviez le palindrome maximum autour du centre actuel
3) Si le palindrome que vous trouvez est plus grand que le palindrome précédent, mettez-le à jour
4) définir le centre actuel comme lettre suivante
5) répétez les étapes 2) à 4) pour toutes les lettres de la chaîne
Cela fonctionne en O (n).
J'espère que ça aide.
la source
Référence: Wikipedia.com
Le meilleur algorithme que j'ai jamais trouvé, avec une complexité O (N)
la source
ma solution est:
la source
Substring()
et string-equal (==
). C'est fondamentalement identique l'algo n ° 1 du PO.