代码随想录day46 || 647 回文子串, 516 最长回文子序列
647 回文字串
copy
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
func countSubstrings(s string) int {
// 动规五部曲
// dp[i][j] 表示s[i: j+1] 区间是否是一个回文
// if s[i] == s[j] {if i-j <= 1 || dp[i+1][j-1] == true { dp[i][j] == true}}
// 初始化为false
// 从下往上,从左往右
// print
var count int
var dp = make([][]bool, len(s))
for i, _ := range dp {
dp[i] = make([]bool, len(s))
}
for i:=len(s)-1; i>=0; i-- {
for j:=i; j<len(s); j++ {
if s[i] == s[j]{
if j-i<=1 || dp[i+1][j-1] == true {
dp[i][j] = true
count++
}
}
}
}
//fmt.Println(dp)
return count
}
516 最长回文子序列
copy
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
func longestPalindromeSubseq(s string) int {
// 647 回文字串变体,只用统计最长字串即可
// dp[i][j] 表示s[i: j+1] 最长回文子串长度
// s[i] != s[j] {dp[i][j] = max(dp[i+1][j-1], dp[i+1][j], dp[i][j-1])} // 删除i, 删除j, 两个都删除
// s[i] == s[j] {dp[i+1][j-1] + 2} // 去除首位之后的最长字串 + 两个字符长度
// 初始化为0 , 多初始化一行一列
// 递推来自三个方向,左下,左,下,所以遍历顺序从下往上,从左往右
// print
var maxlen int
var dp = make([][]int, len(s) + 1)
for i, _ := range dp {
dp[i] = make([]int, len(s) + 1)
}
for i:=len(s); i>=0; i-- {
for j:=i; j<len(s); j++ {
if s[i] == s[j]{
if i == j {
dp[i][j+1] = dp[i+1][j] + 1
}else {
dp[i][j+1] = dp[i+1][j] + 2
}
} else {
dp[i][j+1] = max(dp[i+1][j], max(dp[i+1][j+1], dp[i][j]))
}
if dp[i][j+1] > maxlen {
maxlen = dp[i][j+1]
}
}
}
//fmt.Println(dp)
return maxlen
}
本文作者:周公瑾55
本文链接:https://www.cnblogs.com/zhougongjin55/p/18389962
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
本文作者:周公瑾55
本文链接:https://www.cnblogs.com/zhougongjin55/p/18389962
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步