033. 编写一个函数,检查一个字符串是否是回文

在 Python 中,可以通过多种方式检查一个字符串是否是回文。回文是指一个字符串正读和反读都相同,例如 "racecar" 和 "level"。

示例代码

def is_palindrome(s):
    """
    检查一个字符串是否是回文。

    参数:
        s (str): 要检查的字符串。

    返回:
        bool: 如果字符串是回文,返回 True;否则返回 False。
    """
    # 将字符串转换为小写并去除非字母字符
    cleaned_s = ''.join(char.lower() for char in s if char.isalnum())

    # 检查字符串是否等于其反转
    return cleaned_s == cleaned_s[::-1]

# 测试代码
test_strings = ["racecar", "hello", "A man, a plan, a canal, Panama", "No lemon, no melon"]

for test in test_strings:
    print(f"'{test}' 是回文吗? {is_palindrome(test)}")

运行结果

运行上述代码后,输出如下:

'racecar' 是回文吗? True
'hello' 是回文吗? False
'A man, a plan, a canal, Panama' 是回文吗? True
'No lemon, no melon' 是回文吗? True

代码解释

清理字符串

  • 使用列表推导式和 isalnum() 方法去除字符串中的非字母数字字符。

  • 使用 lower() 方法将所有字符转换为小写,以确保检查时忽略大小写。

检查回文

  • 使用切片操作 cleaned_s[::-1] 反转字符串。

  • 比较原始字符串和反转后的字符串是否相同。

扩展:其他方法

方法 2:使用双指针

可以通过双指针方法从字符串的两端向中间移动,逐个比较字符是否相同。

def is_palindrome(s):
    """
    检查一个字符串是否是回文。

    参数:
        s (str): 要检查的字符串。

    返回:
        bool: 如果字符串是回文,返回 True;否则返回 False。
    """
    # 将字符串转换为小写并去除非字母字符
    cleaned_s = ''.join(char.lower() for char in s if char.isalnum())

    # 使用双指针方法检查回文
    left, right = 0, len(cleaned_s) - 1
    while left < right:
        if cleaned_s[left] != cleaned_s[right]:
            return False
        left += 1
        right -= 1
    return True

# 测试代码
test_strings = ["racecar", "hello", "A man, a plan, a canal, Panama", "No lemon, no melon"]

for test in test_strings:
    print(f"'{test}' 是回文吗? {is_palindrome(test)}")

注意事项

  1. 忽略非字母数字字符:在检查回文时,通常忽略标点符号、空格和大小写。因此,需要先清理字符串。
  2. 效率: 切片操作和双指针方法的时间复杂度都是 O(n),其中 n 是字符串的长度。
  3. 适用场景: 如果字符串很长,双指针方法可能更高效,因为它不需要额外的字符串反转操作。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)