题目:
给你一个字符串
s
,找到s
中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
来源:力扣(LeetCode)
链接:力扣
示例:
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:输入:s = "cbbd"
输出:"bb"
解法:
设最长回文子串(result)的初值为输入字符串的第1个字符,长度(result_len)为1。遍历字符串,每次取切片(sub_s)(外层循环),开始位置从头遍历到尾,结束位置都是末尾。然后对sub_s遍历(内层循环),获得切片,开始位置从头移到尾,结束位置都设为末尾,对每个切片判断是否是回文,如果是则更新result和result_len。最后返回result,为了加速遍历过程,每次切片的长度必须大于result_len,因为长度小于result_len的切片即使是回文也不会改变结果,所以可以跳过。
知识点:
1.字符串切片:字符串的切片和列表的切片一样,str[开始索引:结束索引:步长],开始索引位置默认值为0(闭区间),结束索引默认值为字符串长度(开区间),步长默认值为1,切片结果为原字符串的开始索引到结束索引根据步长提取字符,比如s = "0123456789",s[2:6]为2345。如果步长省略,则第2个“:”也可以省略,当第1个“:”不可省略。关于索引除了正序索引,还有倒序索引,最后1个元素为-1,最后第2个元素为-2,以此类推,比如s[-1::-1]为输入的逆序9876543210。
代码:
class Solution: def longestPalindrome(self, s: str) -> str: result_len = 1 result = s[0] for index in range(len(s)): sub_s = s[index:] for sub_s_index in range(len(sub_s)): if sub_s_index + 1 <= result_len: continue if sub_s[: sub_s_index + 1] == sub_s[sub_s_index::-1]: result_len = sub_s_index + 1 result = sub_s[: sub_s_index + 1] return result