中等
相关标签
相关企业
提示
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:s = “abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”
示例 2:
输入:s = “aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”
提示:
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
}
中等
相关标签
相关企业
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
输入:s = “bbbab”
输出:4
解释:一个可能的最长回文子序列为 “bbbb” 。
示例 2:
输入:s = “cbbd”
输出:2
解释:一个可能的最长回文子序列为 “bb” 。
提示:
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]}