题目链接
https://leetcode.com/problems/longest-palindromic-substring/
题目描述
给定字符串s,找到s中最长的回文子串。
示例
输入:s = "babad"
输出:"bab"
‘aba’同样是符合题意的答案
解题思路
回文串指的是正着读和反着读都一样的字符串,是对称的。因此我们可以枚举回文串的中心,从中间开始向着两端扩散来判断回文串的长度。其中“扩散”过程就需要用到双指针。由于回文串的长度可能为奇数也可能为偶数,因此回文串的中心可能是一个字符(长度为奇数),也可能是两个字符(长度为偶数)。
Python实现
代码实现包括两部分:枚举部分和求以某个元素或某两个元素为中心的最长回文子串的部分。代码框架为:
result = ""
for i in range(len(s)):
#找到以s[i]为中心的最长回文子串
s1 = palindrome(s,i,i)
#找到以s[i]、s[i+1]为中心的最长回文子串
s2 = palindrome(s,i,i+1)
#更新当前最长子串
if(len(s1)>len(res)):
res = s1
if(len(s2)>len(res)):
res = s2
return res
枚举的回文字符串中心从s[0]开始计,因为这样能够涵盖例如"aabc"这样以s[0]和s[1]为中心的回文子串,即s[0]和s[1]组成的字符串。
注意传入palindrome(s,i,i)的后两个参数,表示枚举的中心索引。这样可以由一个函数同时处理中心是一个元素和两个元素的情况。同时在palindrome函数里要进行边界维护。代码整体实现:
class Solution:
def longestPalindrome(self, s: str) -> str:
#以s[i]和s[j]为中心的最长回文字符串
def palindrome(s,i,j):
while(i>=0 and j < len(s) and s[i] == s[j]):
i -= 1
j += 1
#跳出循环有三种情况:i=-1或j=len(s)或s[i]!= s[j],因此回文子串的索引范围为[i+1,j-1]左闭右闭区间
return s[i+1:j]
res = ""
for i in range(len(s)): #枚举中心位置
s1 = palindrome(s,i,i)
s2 = palindrome(s,i,i+1)
if(len(res)<len(s1)):
res = s1
if(len(res)<len(s2)):
res = s2
return res
时间复杂度与空间复杂度
时间复杂度为O(N^2),空间复杂度为O(1)。
参考
https://labuladong.gitbook.io/algo/gao-pin-mian-shi-xi-lie/zui-chang-hui-wen-zi-chuan