L'algorithme sur ce site, semble compréhensible à un certain point
http://www.akalin.cx/longest-palindrome-linear-time
Pour comprendre cette approche, le mieux est d'essayer de résoudre le problème sur le papier et attraper les trucs que vous pouvez mettre en œuvre pour éviter de vérifier le pallindrom pour chaque centre.
Première réponse de vous - même lorsque vous trouvez un pallindrome d'une longueur donnée, disons 5 - ne pouvez-vous pas comme étape suivante, sautez à la fin de cette pallindrome (en ignorant les 4 lettres et 4 midletters)?
Si vous essayez de créer un pallindrom avec une longueur de 8 et placer une autre pallindrome avec une longueur > 8, dont le centre est à droite de la première pallindrome vous remarquerez quelque chose de drôle. Essayez:
Pallindrome avec une longueur de 8 WOWILIKEEKIL - Comme + ekiL = 8
Maintenant, dans la plupart des cas, vous pourriez être en mesure d'écrire en bas de la place entre les deux " E " en tant que centre et nombre 8, comme la longueur et le saut après le dernier L de regarder pour le centre de la plus grande pallindrome.
Cette approche n'est pas correcte, le centre de la plus grande pallindrome peut être à l'intérieur ekiL et vous manquer si vous voulez sauter après le dernier L.
Une fois que vous trouvez COMME+EKIL vous placer 8 dans le tableau que ces algos utiliser et cela ressemble à:
[0,1,0,3,0,1,0,1,0,3,0,1,0,1,0,1,8]
pour
[#,W, N,O, N,W, N,I, N,L, N,I, N,K, N,E,#]
Le truc, c'est que vous savez déjà que la plupart probablement le prochain 7 (8-1) chiffres après 8 sera la même que sur le côté gauche, de sorte que la prochaine étape est de copier automatiquement des 7 numéros de la gauche de 8 de 8 en gardant à l'esprit qu'ils ne sont pas encore définitifs.
Le tableau devrait ressembler à ceci
[0,1,0,3,0,1,0,1,0,3,0,1,0,1,0,1,8,1,0,1,0,1,0,3] (nous en sommes à 8)
pour
[#,W, N,O, N,W, N,I, N,L, N,I, N,K, N,E, N,E, N,K, N,I, N,L]
Nous allons faire un exemple, qu'un tel saut détruire notre solution actuelle et de voir ce que nous pouvons avis.
WOWILIKEEKIL - permet d'essayer de faire de plus grands pallindrome avec le centre de quelque part à l'intérieur de EKIL.
Mais ce n'est pas possible - nous avons besoin de changer de mot EKIL à quelque chose qui contiennent pallindrome.
Quoi? OOOOOh, c'est le truc.
La seule possibilité d'avoir un plus grand pallindrome avec le centre dans le côté droit de notre pallindrome est qu'il est déjà dans la droite (et à gauche) à côté de pallindrome.
Nous allons essayer de construire une base sur WOWILIKEEKIL
Nous aurions besoin de changer EKIL, par exemple, EKIK avec je comme un centre de la plus grande pallindrom - n'oubliez pas de changement de KIKE.
Les premières lettres de notre délicate pallindrom sera:
WOWIKIKEEKIK
comme l'a dit avant de laisser le dernier que j'ai être le centre de la plus grande pallindrome que KIKEEKIK:
WOWIKIKEEKIKEEKIKIW
faisons le tableau jusqu'à nos vieux pallindrom et découvrez comment laverage les informations supplémentaires.
pour
[_ W _ O _ W _ I _ K _ I _ K _ E _ E _ K _ I _ K _ E _ E _ K _ I _ K _ I _ W ]
il sera
[0,1,0,3,0,1,0,1,0,3,0,3,0,1,0,1,8
nous savons que la prochaine je - un 3ème sera la plus longue pallindrome, mais oublions un peu. vous permet de copier des numéros dans le tableau à partir de la gauche de 8 à droite (8 numéros)
[0,1,0,3,0,1,0,1,0,3,0,3,0,1,0,1,8,1,0,1,0,3,0,3]
Dans notre boucle, nous sommes entre " E " avec le numéro 8. Ce qui est spécial à propos de I (futur milieu de la plus grande pallindrome) que nous ne pouvons pas sauter à droite de K (la dernière lettre de actuellement plus pallindrome)?
Le truc, c'est qu'il dépasse la taille actuelle du tableau ... comment?
Si vous déplacer de 3 cases vers la droite de la 3 - vous êtes hors de la matrice. Cela signifie qu'il peut être le milieu de la plus grande pallindrome et le plus loin vous pouvez sauter est cette lettre I.
Désolé pour la longueur de cette réponse - je voulais expliquer l'algorithme et peuvent s'assurer vous - @OmnipotentEntity avait raison - je le comprends encore mieux après avoir expliqué à vous :)