2021-08-04:给定一个字符串str,当然可以生成很多子序列。返回有多少个子序列是回文子序列,空序列不算回文。比如,str = “aba”,回文子序列:{a}{a} {a,a} {b}{(代码片
Posted 福大大架构师每日一题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-08-04:给定一个字符串str,当然可以生成很多子序列。返回有多少个子序列是回文子序列,空序列不算回文。比如,str = “aba”,回文子序列:{a}{a} {a,a} {b}{(代码片相关的知识,希望对你有一定的参考价值。
2021-08-04:给定一个字符串str,当然可以生成很多子序列。返回有多少个子序列是回文子序列,空序列不算回文。比如,str = “aba”,回文子序列:{a}、{a}、 {a,a}、 {b}、{a,b,a},返回5。
福大大 答案2021-08-04:
范围尝试模型。
dp[L][R]。
4种情况。
1.不包含L,不包含R。
2.不包含L,包含R。
3.包含L,不包含R。
4.包含L,包含R。
dp[L][R]依赖dp[L+1][R],dp[L][R-1],dp[L+1][R-1]。
时间复杂度: O(N2)。
空间复杂度: O(N2)。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
ret := ways2("acac")
fmt.Println(ret)
}
func ways2(str string) int {
if len(str) == 0 {
return 0
}
n := len(str)
dp := make([][]int, n)
for i := 0; i < n; i++ {
dp[i] = make([]int, n)
}
for i := 0; i < n; i++ {
dp[i][i] = 1
}
for i := 0; i < n-1; i++ {
if str[i] == str[i+1] {
dp[i][i+1] = 3
} else {
dp[i][i+1] = 2
}
}
for L := n - 3; L >= 0; L-- {
for R := L + 2; R < n; R++ {
dp[L][R] = dp[L+1][R] + dp[L][R-1] - dp[L+1][R-1]
if str[L] == str[R] {
dp[L][R] += dp[L+1][R-1] + 1
}
}
}
return dp[0][n-1]
}
执行结果如下:
以上是关于2021-08-04:给定一个字符串str,当然可以生成很多子序列。返回有多少个子序列是回文子序列,空序列不算回文。比如,str = “aba”,回文子序列:{a}{a} {a,a} {b}{(代码片的主要内容,如果未能解决你的问题,请参考以下文章
精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!(转载)
2023-01-06:给定一个只由小写字母组成的字符串str,长度为N, 给定一个只由01组成的数组arr,长度为N, arr[i] == 0表示str中i位置的字符不许修改, arr[i] ==