Python 怎么判断字符串是否回文?多种方法详解与代码示例,让回文判断更简单
嘿,聊聊 Python 怎么判断回文吧,这事儿其实挺有意思的。你有没有那种感觉,就是有些词或者句子,正着念反着念都一样,像“上海自来水来自海上”,倍儿神奇。编程里,咱们就管这种叫回文。
回文判断,说白了就是看一个字符串是不是左右对称。这事儿用 Python 来做,简直不要太轻松,方法多到让你眼花缭乱。
最简单粗暴的,可能就是直接翻转字符串。Python 里字符串切片贼溜,[::-1]
一下,立马给你倒过来。然后呢,就拿原字符串跟翻转后的字符串比,一样就说明是回文呗。你看这代码,多直白:
“`python
def is_palindrome_v1(text):
processed_text = ”.join(filter(str.isalnum, text)).lower()
return processed_text == processed_text[::-1]
试试看
print(is_palindrome_v1(“madam”)) # True
print(is_palindrome_v1(“racecar”)) # True
print(is_palindrome_v1(“A man, a plan, a canal: Panama”)) # True
print(is_palindrome_v1(“hello”)) # False
“`
这段代码里,我先用 filter(str.isalnum, text)
把字符串里非字母数字的字符都过滤掉,比如空格、标点啥的,然后 .lower()
一下,全转成小写,这样大小写就不影响判断了。比如 “A man, a plan, a canal: Panama” 这种,也能正确判断。最后,processed_text == processed_text[::-1]
这一句,就是见证奇迹的时刻,直接比较。
但这只是最基础的,对吧?你细想,如果字符串特别长,全部翻转过来再比较,是不是有点浪费?
那咱就换个思路,不用完全翻转。我们可以用双指针,一个从头开始,一个从尾开始,俩人同时往中间靠。只要在相遇之前,对应的字符都一样,那就是回文。
“`python
def is_palindrome_v2(text):
processed_text = ”.join(filter(str.isalnum, text)).lower()
left = 0
right = len(processed_text) – 1
while left < right:
if processed_text[left] != processed_text[right]:
return False
left += 1
right -= 1
return True
试试看
print(is_palindrome_v2(“madam”)) # True
print(is_palindrome_v2(“racecar”)) # True
print(is_palindrome_v2(“A man, a plan, a canal: Panama”)) # True
print(is_palindrome_v2(“hello”)) # False
“`
这种方法,理论上来说,效率会高一点,因为不用完全翻转字符串。当然,实际上对于短字符串,可能感觉不出来啥区别。
还有更骚气的操作吗?有!递归!用递归来判断回文,简直就是秀操作。不过说实话,递归这玩意儿,用好了是真漂亮,用不好就容易把自己绕进去。
“`python
def is_palindrome_v3(text):
processed_text = ”.join(filter(str.isalnum, text)).lower()
if len(processed_text) <= 1:
return True
if processed_text[0] != processed_text[-1]:
return False
return is_palindrome_v3(processed_text[1:-1])
试试看
print(is_palindrome_v3(“madam”)) # True
print(is_palindrome_v3(“racecar”)) # True
print(is_palindrome_v3(“A man, a plan, a canal: Panama”)) # True
print(is_palindrome_v3(“hello”)) # False
“`
递归的思路是这样的:如果字符串长度小于等于 1,那肯定是回文。如果首尾字符不一样,那肯定不是回文。如果首尾字符一样,那就把首尾去掉,剩下的字符串继续递归判断。
这三种方法,各有各的特点。第一种最简单,第二种效率可能稍高,第三种最炫酷。选哪个,就看你喜欢了。当然,实际应用中,还要考虑具体的场景和性能要求。
说到性能,其实 Python 在字符串处理方面做了很多优化,所以对于一般情况,这几种方法的效率差别不会太大。但是,如果你处理的是非常非常长的字符串,那可能就要仔细考虑一下了。
除了上面这些,还有一些其他的技巧可以用。比如,可以用正则表达式来过滤非字母数字的字符,这样代码可以更简洁一些。
“`python
import re
def is_palindrome_v4(text):
processed_text = re.sub(r'[^a-zA-Z0-9]’, ”, text).lower()
return processed_text == processed_text[::-1]
试试看
print(is_palindrome_v4(“madam”)) # True
print(is_palindrome_v4(“racecar”)) # True
print(is_palindrome_v4(“A man, a plan, a canal: Panama”)) # True
print(is_palindrome_v4(“hello”)) # False
“`
这里,re.sub(r'[^a-zA-Z0-9]', '', text)
就是用正则表达式把所有非字母数字的字符都替换成空字符串。
Python 判断回文,其实就是这么回事。方法很多,关键是理解思路。选择最适合自己的方法,让代码更简洁、更高效。希望这些代码示例和思路分析能帮到你。下次再遇到回文判断的问题,你就可以自信地说:“这事儿,我熟!”
评论(0)