以下是两个独立的Python程序,分别用于判断单词回文和词组回文。
一、判断单词回文(支持中英文)
defis_word_palindrome(word):
"""
判断单个单词是否为回文(支持中文、英文、数字等)。
策略:直接比较原字符串与其反转后的字符串是否相等。
"""
# 去除字符串两端的空白(如有)
word = word.strip()
# 反转字符串(切片步长-1)
reversed_word = word[::-1]
# 比较并返回布尔值
return word == reversed_word
# 测试
if __name__ == "__main__":
test_cases = ["radar", "kayak", "rotator", "sexes",
"花非花", "上海自来水来自海上", "hello", "Python"]
print("===== 单词回文测试 =====")
for test in test_cases:
result = is_word_palindrome(test)
print(f"'{test}' -> {result}")
运行结果:
===== 单词回文测试 =====
'radar' -> True
'kayak' -> True
'rotator' -> True
'sexes' -> True
'花非花' -> True
'上海自来水来自海上' -> True
'hello' -> False
'Python' -> False
解释说明:
程序使用字符串反转的方式判断回文。word[::-1] 是 Python 中反转字符串的最简洁写法,从末尾开始每次取一个字符,相当于将原字符串倒序排列。直接比较原串与反串是否相等即可。该方法对中文、英文、数字等任意字符都有效,且大小写敏感(若需要忽略大小写,可先将字符串统一转换为 .lower())。
二、判断词组回文(忽略空格、标点、大小写)
import re
defis_phrase_palindrome(phrase: str) -> bool:
"""
判断一个词组或句子是否是回文。
忽略:空格、标点符号、大小写差异(只比较字母和数字)。
原理:
1. 统一转为小写(忽略大小写)
2. 使用正则表达式过滤掉非字母数字的字符(空格、逗号、句号等)
3. 将净化后的字符串与其反转比较
"""
# 转为小写(统一大小写)
phrase_lower = phrase.lower()
# 只保留字母 a-z 和数字 0-9(可根据需要支持中文,见注释)
cleaned = re.sub(r'[^a-z0-9]', '', phrase_lower)
# 判断净化后的字符串是否为回文
return cleaned == cleaned[::-1]
# ----- 测试示例 -----
if __name__ == "__main__":
test_phrases = [
"nurses run",
"stir grits",
"A man, a plan, a canal: Panama",
"Race fast safe car",
"Was it a car or a cat I saw?",
"No 'x' in Nixon",
"hello world"
]
print("\n===== 词组回文测试 =====")
for phrase in test_phrases:
result = is_phrase_palindrome(phrase)
print(f"'{phrase}' -> {result}")
运行结果:
===== 词组回文测试 =====
'nurses run' -> True
'stir grits' -> True
'A man, a plan, a canal: Panama' -> True
'Race fast safe car' -> True
'Was it a car or a cat I saw?' -> True
'No 'x' in Nixon' -> True
'hello world' -> False
解释说明:
词组回文判断的关键在于先忽略干扰字符(空格、标点、引号等)和大小写,只保留字母和数字。
phrase.lower() 将所有字符转为小写,使得 "Nurses" 和 "nurses" 视为相同。re.sub(r'[^a-z0-9]', '', phrase_lower) 使用正则表达式:[^a-z0-9] 表示匹配不是小写字母也不是数字的字符,把它们替换为空字符串(即删除),留下的就是干净的字母数字串。
如果需要支持中文词组(例如“上海自来水,来自海上。”),可以将正则改为 r'[^a-z0-9\u4e00-\u9fff]',其中 \u4e00-\u9fff 是常用汉字的 Unicode 范围。
三、补充说明
1. 核心思路
- 先统一转为小写/大写,再利用正则表达式
re.sub()移除所有非字母数字字符(空格、标点等),得到纯净的字母数字串,最后判断是否为回文。 - 字符串反转:
s[::-1] 是 Python 中最高效、最直观的反转方法,时间复杂度 O(n),空间复杂度 O(n)。
2. 扩展建议
- 如需高性能处理大量数据,可使用双指针法(从两端向中间比较)避免产生反转字符串的副本。
- 正则表达式过滤:正则表达式可根据需要调整:
r'[^a-z0-9]' 只保留英文小写字母和数字;若要保留中文,改为 r'[^a-z0-9\u4e00-\u9fff]'。 - 性能考虑:对于非常长的字符串,使用双指针法(从两端向中间比较)可以节省一半的空间,但代码稍复杂。对于绝大多数应用场景,反转比较已经足够清晰和快速。
- 若需处理超大文本(如几百万字符),需要修改使用合理的方式减少内存占用。
- 若需批量判断大量回文,可以预先编译正则表达式:
pattern = re.compile(r'[^a-z0-9]') 以提高效率。