比如一个回文子串s[L:R],长度大于3,如果需要判断它是否为回文子串,那么就需要知道s[L + 1: R - 1]的状态,因此我们需要注意遍历的顺序,代码如下:
func longestPalindrome(s string) string {
n := len(s)
L := 0
R := 1
f := make([][]bool, n)
for i := 0; i < n; i ++ {
f[i] = make([]bool, n)
f[i][i] = true
}
for i := 1; i < n; i ++ {
for j := i - 1; j >= 0; j -- {
if s[i] != s[j] {
f[i][j] = false
} else {
if i - j <= 2 {
f[i][j] = true
} else {
f[i][j] = f[i - 1][j + 1]
}
}
if f[i][j] && i - j + 1 > R - L {
L = j
R = i + 1
}
}
}
return s[L:R]
}
二刷,ok
func longestPalindrome(s string) string {
n := len(s)
f := make([][]bool, n)
for i := 0; i < n; i ++ {
f[i] = make([]bool, n)
f[i][i] = true
}
MaxL, MaxR := 0, 1
for i := 1; i < n; i ++ {
for j := i - 1; j >= 0; j -- {
if s[i] == s[j] {
if i == j + 1 {
f[i][j] = true
} else {
f[i][j] = f[i - 1][j + 1]
}
if i - j + 1 > MaxR - MaxL && f[i][j] {
MaxL, MaxR = j, i + 1
}
}
}
}
return s[MaxL: MaxR]
}