📅  最后修改于: 2023-12-03 15:12:11.043000             🧑  作者: Mango
回文字符串是指正着读和反着读都一样的字符串。
例如,下面这些字符串都是回文字符串:
判断一个字符串是否是回文字符串是编程中经常用到的问题。
一个简单的解决方案是将字符串反转后再比较是否相等。
def is_palindrome(s: str) -> bool:
return s == s[::-1]
但是,这种方法每次都需要反转整个字符串,时间复杂度为 O(n)。
另一种更高效的方法是使用双指针算法。定义两个指针,分别从字符串的左右两端开始移动。如果两个指针所指的字符相等,则继续移动;如果不相等,则说明不是回文字符串。
def is_palindrome(s: str) -> bool:
left, right = 0, len(s) - 1
while left < right:
if s[left] != s[right]:
return False
left += 1
right -= 1
return True
这种方法的时间复杂度为 O(n/2),即 O(n),不需要额外的空间。
现在你已经了解了如何判断一个字符串是否是回文字符串,那么现在通过一些练习来巩固一下吧。
给定一个字符串,删除其中的特殊字符和空格,判断是否是回文字符串。
def is_palindrome_no_space(s: str) -> bool:
s = ''.join(filter(str.isalnum, s)).lower()
return is_palindrome(s)
该函数中,首先使用 isalnum()
方法过滤掉字符串中的特殊字符和空格,然后将字符串转换为小写字母,最后调用 is_palindrome()
函数判断是否是回文字符串。
给定一个字符串,找到其中最长的回文子串。
def longest_palindromic_substring(s: str) -> str:
if not s:
return ''
start, end = 0, 0
for i in range(len(s)):
len1 = expand_center(s, i, i)
len2 = expand_center(s, i, i + 1)
length = max(len1, len2)
if length > end - start:
start = i - (length - 1) // 2
end = i + length // 2
return s[start:end + 1]
def expand_center(s: str, left: int, right: int) -> int:
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
return right - left - 1
该函数中,定义了 expand_center()
函数用于向左右两边扩展回文字符串的长度。然后通过遍历字符串,以当前字符为中心,向左右两边扩展,找到最长的回文子串。最后返回最长回文子串。
本文介绍了回文字符串的概念和解决方案。通过双指针算法,可以快速判断一个字符串是否是回文字符串,而且时间复杂度为 O(n)。通过练习,可以进一步巩固你的技能。