516. 最长回文子序列

516. 最长回文子序列

1.想法

image.png

我们采用动态规划

1.建模

a.解:将f[n][n]数值填满
b.目标函数:f[0][n-1]最大
c.约束条件:必须为回文序列

2.子问题优化

f[i][j]代表了从i索引处开始,到j索引处结束,所代表的最大的回文序列长度

1)i == j的时候,
f[i][j] =1

  1. i <j 的时候
    f[i][j] = max(f[k][j-1]+2,f[i][j-1] chs[k] == chs[j]

3.规约公式

f[i][j] \begin{cases} 1,&i ==j\\ max(f[i][j-1],f[k][j-1]+2),&chs[k] == chs[j] \end{cases}

2.代码实现

public int longestPalindromeSubseq(String s) {
        int n = s.length();
        int[][] f = new int[n][n];
        char[] chs = s.toCharArray();
        for(int j=0;j<n;j++){
            for(int i=j;i>-1;i--){
                if(i == j)f[i][j]=1;   //i==j
                else{
                    int index = findMyIndex(chs,i,j);  //寻找K的索引
                    if(index == -1){
                        f[i][j] = f[i][j-1];  
                    }else{
                        f[i][j] = Math.max(f[i][j-1],f[index+1][j-1]+2);  //找出最大的值
                    }
                }
            }
        }
        return f[0][n-1];

    }
   //寻找K的索引
    private int findMyIndex(char[] chs, int i, int j) {  
        for(int index=i;index<j;index++){
            if(chs[index] == chs[j]){
                return index;
            }
        }
        return -1;

    }

3.改进其实不需要找到和chs[j]相同的k的索引

我们在计算的过程中已经把f[i][j-1]之前的和f[i+1][j]之间的都算过了,所以我们不需要找到k所在的索引
那么规约公式就变成了
f[i][j]= \begin{cases} 1,&i ==j\\ max(f[i][j-1],f[i+1][j]),&chs[i] != chs[j]\\ f[i+1][j-1]+2,&chs[i] == chs[j] \end{cases}

代码

public int longestPalindromeSubseq(String s) {
        int n = s.length();
        int[][] f = new int[n][n];
        char[] chs = s.toCharArray();
        for(int j=0;j<n;j++){
            for(int i=j;i>-1;i--){
                if(i == j)f[i][j]=1;
                else{
                    if (chs[i] == chs[j]) {
                        f[i][j] = f[i + 1][j - 1] + 2;
                    } else {
                        f[i][j] = Math.max(f[i + 1][j], f[i][j - 1]);
                    }
                }
            }
        }
        return f[0][n-1];

    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 描述:给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。 示例 1: 输入:"bbbab...
    大数据Zone阅读 1,687评论 0 1
  • 题目描述 给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。 示例 1: 输入:"bbb...
    zhipingChen阅读 355评论 0 1
  • 问题 这个题目的dp 状态很好理解, 但是状态转化公式需要再总结一下
    cptn3m0阅读 359评论 0 0
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 4,156评论 0 2
  • 缩短了距离 又阻碍了距离 你是个矛盾体 又是一个多元体 有你在 我忘记了拿笔 有你在 我忘记了情感 有你在 我忘记...
    黄粱一梦今生缘阅读 1,136评论 13 32

友情链接更多精彩内容