(leetcode刷题)
最长回文子串
题目: 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例: 输入: "babad"
;输出: "bab"
或"aba"
输入:"cbbd"
;输出:"bb"
方法
- 我的想法:根据回文的原理,从中心扩散到周围。若左边==右边,则左-1且右-1,继续寻找,否则返回已经寻找到的子串。
- 分为两个部分寻找,奇数回文子串和偶数回文子串。
def longestPalindrome(self, s: str) -> str:
slen = len(s)
# 长度小于2或等于2的时候字符相同,则返回给定字符串
if slen < 2 or (slen == 2 and s[0] == s[1]): return s
final = s[0]
for i in range(0, slen - 1):
rep1 = rep2 = s[i]
j = 1
# 寻找奇数回文子串
if s[i - j] == s[i + j] and i > 0:
rep1 = s[i - j] + rep1 + s[i + j]
j += 1
while i - j >= 0 and i + j <= slen - 1 and s[i - j] == s[i + j]:
rep1 = s[i - j] + rep1 + s[i + j]
j += 1
j = 1
# 寻找偶数回文子串
if s[i - j + 1] == s[i + j]:
rep2 += s[i + 1]
j += 1
while i - j + 1 >= 0 and i + j <= slen - 1 and s[i - j + 1] == s[i + j]:
rep2 = s[i - j + 1] + rep2 + s[i + j]
j += 1
if len(rep1) > len(final):
final = rep1
if len(rep2) > len(final):
final = rep2
return final