在忽略特殊字符时检查是否有回文

时间:2013-12-02 20:50:13

标签: recursion python-3.x

我失败了最后一个测试用例,它是带有空格和单引号的测试用例。 我使用了s.strip,但错误仍然存​​在。

还有其他方法可以解决这个问题吗?

谢谢。

from test import testEqual
def removeWhite(s):
    s.strip()
    s.strip("'")
    return s

def isPal(s):

    if s == "" or len(s) == 1:
        return True
    if removeWhite(s[0]) != removeWhite(s[-1]):
        return False
    return isPal(removeWhite(s[1:-1]))

testEqual(isPal(removeWhite("x")),True)
testEqual(isPal(removeWhite("radar")),True)
testEqual(isPal(removeWhite("hello")),False)
testEqual(isPal(removeWhite("")),True)
testEqual(isPal(removeWhite("hannah")),True)
testEqual(isPal(removeWhite("madam i'm adam")),True)

1 个答案:

答案 0 :(得分:0)

首先,removeWhite函数不返回所有空格,因为strip仅从字符串的结尾和开头删除。参见:

>>> "   a   ".strip()
'a'
>>> "   a a   ".strip()
'a a'

所以我建议采用这种方法:

def removeWhite(s):
    return ''.join(filter(lambda x: x not in " '", s))

请注意我使用join,因为filter返回一个需要转换回字符串的迭代器。

为了找到回文,我会建议这个功能:

def isPal(s):
    if len(s) <= 1:                       # Special case to prevent KeyError later
        return True
    stripped = removeWhite(s)             # Strip off all whitespaces
    first = stripped[:len(stripped) // 2] # First half of the string
    if len(stripped) % 2:                 # Length of string is even?
        second = stripped[len(stripped) // 2 + 1:] # Drop the middle character
    else:
        second = stripped[len(stripped) // 2:] # Else keep it
    secondrev = ''.join(reversed(second)) # Reverse the second half
    return first == secondrev             # And return wether they're equal.

这适用于您的所有示例。但是,如果您修复了isPal函数

,它认为您的removeWhite函数也应该有效