2010-01-19 9 views
4

Est-ce une bonne idée de vérifier la longueur impaire/paire d'un nombre/chaîne de palindrome? La plupart des extraits que j'ai rencontrés ne font pas ce test de base. Si la longueur est paire, ça ne peut pas être un palindrome, non?Vérifiez pair/impair pour Palindrome?

if len(var) % 2 != 0: 
    # could be a palindrome, continue... 
else: 
    break 

Ou est-ce juste mieux (i.e. plus rapide) pour commencer à comparer le premier et le dernier numéro/lettres directement?

Modifier: D'accord, question stupide, j'aurais dû réfléchir deux fois! :)

+5

Doc, note, je dis! Un jeûne n'empêche jamais une grosseur, je diète sur la morue. –

+1

@Nimbuz: Penser ONCE devrait suffire :-) –

+0

@John Yea, mais je ne l'ai pas eu la première fois, alors DEUX FOIS ... :) – 3zzy

Répondre

22

ABBA - un exemple de palindrome de quatre lettres signifiant une longueur égale.

A palindrome est un mot, une phrase, number, ou une autre séquence de characters qui lit le même arrière ou en avant ...

+0

Ah! D'accord, j'aurais du y réfléchir! :) – 3zzy

+4

Considérez également que si vous répétez un mot avant, puis vers l'arrière, qu'il ait une longueur paire ou impaire, le mot combiné aura une longueur égale, par ex. bonjour = helloolleh. –

+9

Je n'aurais jamais deviné que cela pourrait être une réponse valide à une question liée à la programmation. –

8

baab = palindrome et a une longueur de 4, qui est même

+1

4 est la seule exception? – 3zzy

+1

non alternativement nous pourrions avoir baaaab - c'est toujours un palindrome – Aly

+0

** bb ** est aussi un palindrome :-) –

1

Même les chaînes de longueur peuvent être palindromes aussi. Wikipedia ne dit rien sur cette restriction.

10

La meilleure façon de vérifier un palindrome est simplement comparer la chaîne contre c'est inverse:

def ispalindrome(s): 
    return s == s[::-1] 

il utilise des tranches étendues avec un pas négatif à marcher à reculons à travers s et obtenir l'inverse.

+2

voulez-vous deux signes égaux là (pour une valeur de retour booléenne)? 'return s == s [:: - 1]' – tgray

+0

utilisez == not = (plus de caractères pour rendre le débordement de pile heureux) – cmaynard

+0

@tgray: oh, oui je l'ai fait. – sth

2

Cas simple: aa.

Cas plus compliqué: aaaa.

Et ainsi de suite.

+2

Chaque fois que je lis "aa" je reçois une réaction instinctive pour dire "pahoehoe". –

3

Essayez ceci:

is_palindrome = lambda s : all(s1==s2 for s1,s2 in zip(s[:len(s)/2],s[-1:-(len(s)+1)/2:-1])) 

vérifie uniquement la moitié avant avec la moitié arrière et les courts-circuits dès qu'une discordance est trouvée.

+0

Cette solution prend autant de mémoire que l'implémentation beaucoup plus simple de @sth: est d'environ 1/10ème de la vitesse, et dit que "ab" est un palindrome. Voici une meilleure solution avec seulement une surcharge de mémoire fixe: all (s [i] == s [-i-1] pour i dans la plage (len (s) // 2)). C'est aussi plus rapide que votre exemple d'environ 20%. –

+0

Aïe! Mon test était un peu trop léger. J'ai modifié ma réponse pour échouer sur le test "ab". Mon parti pris dernièrement a été plus pour l'itération sur les éléments que pour l'indexation en utilisant des indices entiers, je pense que je vais prendre un cours légèrement différent en utilisant un générateur qui entre des deux extrémités de la chaîne. – PaulMcG

+0

Essayez islice, izip et inversé? all (c1 == c2 pour c1, c2 dans islice (izip (s, inversé (s)), 0, len (s) // 2)) –

0
n=raw_input("Enter a string==>") 
n=int(n) 

start=0 
term=n 

while n>0: 
    result=n%10 
    start=start*10+result 
    n=n/10 

print start 

if term==start: 
    print "True" 
else: 
    print "False"