力扣的最长回文子串解法
题目描述:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
参考程序1:
class Solution:
def longestPalindrome(self, s: str) -> str:
temp = temp1 = 0
for i in range(len(s)):
len1 = self.centerexpand(s, i, i)
len2 = self.centerexpand(s, i, i+1)
max_len = max(len1, len2)
if max_len > temp1 - temp + 1:
temp = i - (max_len - 1)//2
temp1 = i + max_len//2
return s[temp: temp1+1]
def centerexpand(self,s,h,result):
while h >= 0 and result < len(s) and s[h] == s[result]:
h -= 1
result += 1
return result - h - 1
运行结果1:
参考程序2:
class Solution:
def longestPalindrome(self, s: str) -> str:
temp=1
templ=0;
tempr=0
for i in range(len(s)):
l=i-1
r=i+1
result=1
while(l>=0 and r<len(s) and s[l]==s[r]):
result+=2
l-=1
r+=1
if temp<result:
temp=result
templ=l+1
tempr=r-1
if i+1<len(s) and s[i]==s[i+1]:
l=i-1
r=i+2
result=2
while(l>=0 and r<len(s) and s[l]==s[r]):
result+=2
l-=1
r+=1
if temp<result:
temp=result
templ=l+1
tempr=r-1
return s[templ:tempr+1]
运行结果2:
参考程序3:
class Solution:
def longestPalindrome(self, s: str) -> str:
if s == None:
return None
length = len(s)
if length <= 1:
return s
dp = [[0 for i in range(length)] for i in range(length)]
result = s[0]
temp = 1
for i in range(0,length):
for j in range(0,i+1):
if i-j<=1:
if s[j]==s[i]:
dp[j][i]=1
if temp < i-j+1:
result = s[j:i+1]
temp = i-j+1
else:
if s[j]==s[i] and dp[j+1][i-1]:
dp[j][i]=1
if temp < i-j+1:
result = s[j:i+1]
temp = i-j+1
return result
运行结果3: