如何判断一个字符串是否为回文?
判断回文字符串的Python实现
嘿,这有几个实用的Python函数实现,能帮你判断一个字符串是不是回文,还考虑了不同的场景需求,我会逐个解释清楚:
1. 简洁版:利用Python切片快速实现
这是最直观也最简洁的写法,适合大多数日常场景:
def is_palindrome(s: str) -> bool: # 统一转小写,解决大小写差异(比如"Anna"也应该被判定为回文) normalized_s = s.lower() # 切片[::-1]直接反转字符串,和原规范化字符串比较 return normalized_s == normalized_s[::-1]
测试示例:
print(is_palindrome("radar")) # 输出: True print(is_palindrome("hello")) # 输出: False print(is_palindrome("Anna")) # 输出: True
关键知识点:
s.lower():把所有字符转成小写,避免因大小写不同导致误判(比如"Racecar"和"racecar"其实是回文)。[::-1]:Python的切片技巧,步长为-1时会从序列末尾开始取值,直接生成反转后的字符串,代码简洁又高效。
2. 增强版:支持过滤非字母数字字符
如果需要处理包含标点、空格的字符串(比如经典的"A man, a plan, a canal: Panama"),可以先过滤掉无关字符:
def is_palindrome(s: str) -> bool: # 过滤非字母数字字符并转小写:只保留字母/数字,拼接成新字符串 normalized_s = ''.join([char.lower() for char in s if char.isalnum()]) return normalized_s == normalized_s[::-1]
测试示例:
print(is_palindrome("A man, a plan, a canal: Panama")) # 输出: True print(is_palindrome("No 'x' in Nixon")) # 输出: True
关键知识点:
char.isalnum():判断字符是否为字母或数字,过滤掉空格、标点等无关字符。- 列表推导式 +
''.join():快速生成过滤后的规范化字符串。
3. 底层实现版:双指针法(空间更高效)
如果要处理超长字符串,不想额外生成反转后的字符串副本,可以用双指针法,空间复杂度为O(1):
def is_palindrome(s: str) -> bool: normalized_s = s.lower() left = 0 right = len(normalized_s) - 1 while left < right: # 如果左边字符不相等,直接返回False if normalized_s[left] != normalized_s[right]: return False # 指针向中间移动 left += 1 right -= 1 # 所有对称字符都匹配,返回True return True
逻辑说明:
- 用两个指针分别从字符串的开头和结尾出发,逐个比较对应位置的字符。
- 只要发现一对字符不匹配,立刻返回False;如果所有对称位置都匹配,最后返回True。
- 这个方法不需要创建新字符串,内存占用更少,适合处理大文本。
总结
- 日常快速开发选切片版,代码简洁易读。
- 需要处理带标点/空格的字符串选增强过滤版。
- 追求内存效率或学习底层逻辑选双指针版。
内容的提问来源于stack exchange,提问作者whitecat
相关产品推荐
相关产品推荐

