题目描述
https://leetcode-cn.com/problems/longest-palindromic-substring/
思路题解
动态规划法
带剪枝自敲代码:
func longestPalindrome(s string) string {
var n=len(s)
var p [1000][1000]int
//0则是回文串,1则不是回文串,d是间隔
for d:=1;d<n;d++{
i:=0
if i+d>=n{
continue
}
if d==1{
for i+d<n{
j:=i+d
if !(s[i]==s[j]){
p[i][j]=1
}
i++
}
}else{
for i+d<n{
j:=i+d
if !(p[i+1][j-1]==0 && s[i]==s[j]){
p[i][j]=1
}
i++
}
}
}
for d:=n-1;d>=0;d--{
i:=0
if i+d>=n{
continue
}
for i+d<n{
j:=i+d
if p[i][j]==0{
return s[i:j+1]
}
i++
}
}
return ""
}
不带剪枝代码:
func longestPalindrome(s string) string {
var n=len(s)
ans := ""
p := make([][]int, n)
for i := 0; i < n; i++ {
p[i] = make([]int, n)
}
//1则是回文串,0则不是回文串,d是间隔
for d:=0;d<n;d++{
for i:=0;i+d<n;i++{
j:=i+d
if d==0{
p[i][j]=1
}else if d==1{
if s[i]==s[j]{
p[i][j]=1
}
}else{
if s[i]==s[j]{
p[i][j]=p[i+1][j-1]
}
}
if p[i][j]==1 && d+1>len(ans){
ans=s[i:j+1]
}
}
}
return ans
}
中心扩散法
func longestPalindrome(s string) string {
if s == "" {
return ""
}
start, end := 0, 0
for i := 0; i < len(s); i++ {
left1, right1 := expandAroundCenter(s, i, i)
left2, right2 := expandAroundCenter(s, i, i + 1)
if right1 - left1 > end - start {
start, end = left1, right1
}
if right2 - left2 > end - start {
start, end = left2, right2
}
}
return s[start:end+1]
}
func expandAroundCenter(s string, left, right int) (int, int) {
for ; left >= 0 && right < len(s) && s[left] == s[right]; left, right = left-1 , right+1 { }
return left + 1, right - 1
}
class Solution:
def longestPalindrome(self, s: str) -> str:
def judge(l,r):
while l>=0 and r<n and s[l]==s[r]:
l-=1
r+=1
return l+1,r-1
n=len(s)
l,r=0,0
for i in range(n):
l1,r1=judge(i,i)
l2,r2=judge(i,i+1)
if r-l<=r1-l1:
l,r=l1,r1
if r-l<=r2-l2:
l,r=l2,r2
return s[l:r+1]