647. 回文子串
中等
相关标签
相关企业
提示
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:s = “abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”
示例 2:
输入:s = “aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”
提示:
- 1 <= s.length <= 1000
- s 由小写英文字母组成
思路 - 遍历顺序
- dp[i + 1][j - 1] 在 dp[i][j]的左下角
- 所以一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的。
代码
package __DP
import "fmt"
func countSubstrings(s string) int {
n := len(s)
/*
dp[i][j] 表示 s[i:j]是回文串
*/
dp := make([][]bool, n)
for i := 0; i < n; i++ {
dp[i] = make([]bool, n)
dp[i][i] = true
}
res := 0
for i := n - 1; i >= 0; i-- {
for j := i; j < n; j++ {
if s[i] == s[j] {
if i == j || j-1 == i {
dp[i][j] = true
} else if j-1 >= 0 {
dp[i][j] = dp[i+1][j-1]
}
}
if dp[i][j] {
res++
}
}
}
fmt.Println(dp)
return res
}
516. 最长回文子序列
中等
相关标签
相关企业
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
输入:s = “bbbab”
输出:4
解释:一个可能的最长回文子序列为 “bbbb” 。
示例 2:
输入:s = “cbbd”
输出:2
解释:一个可能的最长回文子序列为 “bb” 。
提示:
- 1 <= s.length <= 1000
- s 仅由小写英文字母组成
代码
func longestPalindromeSubseq(s string) int {
size := len(s)
max := func(a, b int) int {if a > b {return a
}return b
}
dp := make([][]int, size)for i := 0; i < size; i++ {
dp[i] = make([]int, size)
dp[i][i] = 1}for i := size - 1; i >= 0; i-- {for j := i + 1; j < size; j++ {if s[i] == s[j] {
dp[i][j] = dp[i+1][j-1] + 2} else {
dp[i][j] = max(dp[i][j-1], dp[i+1][j])}}}return dp[0][size-1]}
本文介绍了如何使用动态规划解决两个相关问题:统计给定字符串中回文子串的数量和找到最长回文子序列的长度。通过遍历和比较字符,利用状态转移方程dp[i][j]来计算结果。

207

被折叠的 条评论
为什么被折叠?



