首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2021-08-04:给定一个字符串str,当然可以生成很多子序列

2021-08-04:给定一个字符串str,当然可以生成很多子序列

原创
作者头像
福大大架构师每日一题
修改2021-08-05 09:59:03
修改2021-08-05 09:59:03
3220
举报

2021-08-04:给定一个字符串str,当然可以生成很多子序列。返回有多少个子序列是回文子序列,空序列不算回文。比如,str = “aba”,回文子序列:{a}、{a}、 {a,a}、 {b}、{a,b,a},返回5。

福大大 答案2021-08-04:

范围尝试模型。

dpL。

4种情况。

1.不包含L,不包含R。

2.不包含L,包含R。

3.包含L,不包含R。

4.包含L,包含R。

dpL依赖dpL+1,dpL,dpL+1。

时间复杂度: O(N**2)。

空间复杂度: O(N**2)。

代码用golang编写。代码如下:

代码语言:txt
复制
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]
}

执行结果如下:

图片
图片

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档