0

我需要派生一个函数,它接受一个字符串并返回该字符串是否是回文,如果不考虑空格,我的函数应该在回文字符串上返回 True(所以它应该说'a man a plan a canal panama”或“was it eliots toilet i saw”是回文),但它不需要考虑大小写或标点符号的变化(因此它可能在“A man, a plan, a canal - Panama!”和“Was it Eliot's”上返回 False我看到的厕所?')。

我努力了

def palindrome(s):
    return len(s) < 2 or s[0] == s[-1] and palindrome(s[1:-1])

def ispalindrome(word):
    if len(word) < 2: return True
    if word[0] != word[-1]: return False
    return ispalindrome(word[1:-1])

但两者都没有工作。有什么建议么?我正在使用 python 3.3

4

3 回答 3

5
>>> text = 'a man a plan a canal panama'
>>> x = ''.join(text.split())
>>> x == x[::-1]
True
于 2013-03-24T00:49:52.677 回答
1

大纲

如果第 i 个字符与第 len-i 个字符相同,则短语是回文。由于该系列是镜像,因此您只需走到中间即可。

为了获得您正在寻找的效果,您可以在计算字符串是否为回文之前对空格、标点符号和字符串大小写进行规范化。

代码

from string import punctuation

def is_palindrome(s):
    return all(s[i] == s[-(i + 1)] for i in range(len(s)//2))

def normalized_palindrome(s):
    return is_palindrome("".join(c for c in s.replace(" ","").lower() if c not in punctuation))

您还可以使用zipandreversed对字母进行成对迭代:

def is_palindrome(s):
    return all(a == b for a, b in zip(s, reversed(s)))

当然,这并不止于中间。

测试

>>> tests = [
...     "able was I ere I saw Elba",
...     "a man, a plan, a canal: Panama!",
...     "Was it Eliot's toilet I saw?",
... ]
>>> 
>>> for test in tests:
...     print normalized_palindrome(test)
... 
True
True
True

你的代码

至于您的原件,我是正确的:

>>> s = "able was I ere I saw Elba".lower()
>>> def ispalindrome(word):
...     if len(word) < 2: return True
...     if word[0] != word[-1]: return False
...     return ispalindrome(word[1:-1])
... 
>>> ispalindrome(s)
True
>>> s = "a man a plan a canal panama"
>>> ispalindrome(s)
False
>>> ispalindrome(s.replace(" ",""))
True
于 2013-03-24T02:28:00.980 回答
0

您可以存储没有特殊字符和空格的字符串,然后检查它是否是回文。

def isPalindrome(s: str) -> bool:
    mystring = s.lower()
    mystring2 = ""
    for i in mystring:
        if i.isalnum():
            mystring2 += i

    return (mystring2 == mystring2[::-1])
于 2020-08-03T18:56:32.297 回答