相关链接
题目描述
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例2:
输入: "cbbd"
输出: "bb"
题目解析
看到这个题目,就想到第三题找最长无重复子串,但是有很大区别,相同之处就是关于子串。那么第一印象就是去暴力破解,遍历字符串,取出子串,判断其逆置后是否与其相同,也就是判断是否符合回文。从中寻找最长的一个,下面就是该方法的具体过程。
class Solution:
def longestPalindrome(self, s: str) -> str:
string = ""
lenth = -1
for i in range(len(s)):
for j in range(i, len(s)):
a = s[i:j+1]
if a == a[::-1] and len(a) > lenth:
string = a
lenth = len(a)
return string
其中,a[::-1] 运用了列表的切片,-1使其逆序排列。执行测试数据时通过了,但是在提交的时候出了问题,原因是超时,因为这个方法是暴力破解,超时的测试数据是 “一千个一” ,这就不意外了,两层的循环到最后一次才能到测试数据,超时是肯定的。参考了一下题解,提到了中心扩展算法,实现了一下,程序如下。
class Solution:
def longestPalindrome(self, s: str) -> str:
if s == s[::-1]:
return s
res = s[:1]
for i in range(len(s)):
len1 = self.extention(s, i, i)
len2 = self.extention(s, i, i+1)
res = max(len1, len2, res, key=len)
return res
def extention(self, s, left, right):
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
return s[left+1:right]
解释一下以上程序,中心扩展算法需要考虑 2N+1 个中心,分别为回文子串长度为奇数时,中心值为中间一个字符,有 N 种情况,回文子串长度为偶数时,中心值为中间两个字符,两个字符为中心有 N-1 种情况。因此,循环遍历这些情况,再建立一个从中间扩展两侧字符的函数,当两侧字符一致时,向外扩展一层。接下来,就需要你去品程序了,你细细的品。
完
扫描二维码
获取更多精彩
小田学Python