最长回文子串
程序员文章站
2022-07-13 21:58:50
...
最长回文子串
babad举例子
b | a | b | a | d | |
---|---|---|---|---|---|
b | o | x | o | x | x |
a | x | o | x | o | x |
b | o | x | o | x | x |
a | x | o | x | o | x |
d | x | x | x | x | o |
回文子串相当于二维数组,需要知道开始和结束位置,表中o代表是回文,横纵坐标分表代表开始和结束位置,其中有一边(开始大于结束忽略,对称的)
s 是字符串,长度用s(i,j)表示,i开始位置,j结束位置
判断s是回文,需要判断s[i] == s[j], && s[i+1, j-1]是回文
默认s[i][i]是回文
即
// 状态:s[i][j] 表示i到j是一个回文字符串
// 推导:s[i][j] a[i]==a[j]&&s[i+1][j-1]==true
// 初始化:s[j][j] = true
func longestPalindrome(s string) string {
if s == "" {
return ""
}
if len(s) == 1 {
return s
}
flag := make([][]bool, len(s))
str := make([]string, 0)
str = append(str, s[0:1])
for i := 0; i < len(s); i++ {
flag[i] = make([]bool, len(s))
}
//
for j := 1; j < len(s); j++ {
flag[j][j] = true
for i := 0; i < j; i++ {
// 推导过程
if s[j] == s[i] && (i+1 >= j-1 || flag[i+1][j-1]) {
flag[i][j] = true
str = append(str, s[i:j+1])
}
}
}
sort.Slice(str, func(a, b int) bool {
return len(str[a]) < len(str[b])
})
return str[len(str)-1]
}