2010-01-19 89 views
4

檢查迴文數字/字符串的奇數/偶數長度是否是一個好主意?我遇到的大多數片段都不做這個基本測試。如果長度是偶數,它不能是迴文,否?爲迴文檢查偶數/奇數?

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

或者是直接比較第一個和最後一個數字/字母是否更好(即更快)?

編輯:好的,愚蠢的問題,應該想過兩次! :)

+5

Doc,note,I dissent!快速從來不會阻止肥胖,我在鱈魚飲食。 –

+1

@Nimbuz:認爲一次就夠了:-) –

+0

@約翰是的,但我沒有得到它的第一次,所以TWICE ... :) – 3zzy

回答

22

ABBA - palindrome四個字母意思是偶數長度的例子。

一個迴文是一個單詞,短語,number,或characters其他序列讀取相同的向前或向後...

+0

啊!好吧,應該好好想想! :) – 3zzy

+4

還要考慮如果你重複任何單詞向前,然後向後,無論它有偶數還是奇數長度,組合單詞將有一個均勻的長度,例如, hello = helloolleh。 –

+9

我從來沒有猜到這可能是一個有關編程相關問題的有效答案。 –

8

BAAB =迴文並且具有4長度這甚至

+1

4是唯一的例外? – 3zzy

+1

no或者我們可以有baaaab - 這仍然是一個迴文 – Aly

+0

** bb **也是一個迴文:-) –

1

即使長字符串可以是迴文太。 Wikipedia沒有說這個限制。

10

檢查迴文最簡單的方法是簡單地比較字符串反對它的反向:

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

此使用擴展的片,用負一步通過s倒退行走,並得到 相反。

+2

你想要兩個等號嗎(對於布爾返回值)? 'return s == s [:: - 1]' – tgray

+0

使用==不= =(更多字符使堆棧溢出開心) – cmaynard

+0

@tgray:哦,是的,我做到了。 – sth

2

簡單情況:aa。

更復雜的情況:aaaa。

依此類推。

+2

每當我讀到「aa」時,我會得到一個膝蓋反應來說「pahoehoe」。 –

3

試試這個:

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

只有儘快發現不匹配檢查前半部與後半部,和短路。

+0

這個解決方案需要的內存和@sth一樣多:更簡單的實現,大約是速度的十分之一,並且說「ab」是一個迴文。這裏有一個更好的解決方案,只有固定的內存開銷:all(s [i] == s [-i-1],用於範圍內的len(s)// 2)。這比你的例子快20%左右。 –

+0

哎唷!我的測試是有點*太輕*我已經編輯了我的答案,現在無法測試「ab」。最近我的偏見更多的是迭代元素,而不是使用整數下標進行索引,我想我會稍微區分一下使用從字符串兩端走入的生成器。 – PaulMcG

+0

嘗試islice,izip和扭轉? all(c1 == c2 for c1,c2 in islice(izip(s,reversed(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"