zoukankan      html  css  js  c++  java
  • LeetCode 516——最长回文子序列

    1. 题目

    2. 解答

    与最长回文子串类似,我们可以用动态规划来求解这个问题,只不过这里的子序列可以不连续。我们定义状态 state[i][j] 表示子串 s[i, j] 的最长回文子序列长度,那么状态转移方程为:

    [state[i][j] = 1 space 如果 space i = j ]

    [state[i][j] = egin{cases} state[i+1][j-1] + 2 & ext{如果 } s[i] == s[j] \ max(state[i+1][j], state[i][j-1]) & ext{如果 } s[i] != s[j] end{cases}]

    上式第一行代表如果两端元素相等,那么回文子序列长度增加 2;如果两端元素不相等,那么回文子序列长度为分别去掉两端一个元素之后的两个子串回文子序列长度的较大值。同样地,我们需要自底向上更新状态,首先是长度为 1 的子串,再然后是长度为 2 的,一直递增下去。

    int longestPalindromeSubseq(string s) {
        
        int n = s.size();
        if (n == 0) return 0;
        
        vector<int> temp(n, 0);
        vector< vector<int>> state(n, temp);
        int max_len = 1;
        // 初始化长度为 1 的子串
        for (int i = 0; i < n; i++)
                state[i][i] = 1;
    
        // 坐标差从 1 开始,也即长度为 2
        for (int len = 1; len < n; len++)
        {
            for (int i = 0; i < n-len; i++)
            {
                int j = i + len;
                if (s[i] == s[j])
                    state[i][j] = state[i+1][j-1] + 2;
                else    
                    state[i][j] = max(state[i][j-1], state[i+1][j]);
                
                if (state[i][j] > max_len)
                    max_len = state[i][j];
            }
        }
    
        return max_len;
    
    }
    

    获取更多精彩,请关注「seniusen」!

  • 相关阅读:
    uwsgi配置
    sed_shell三剑客
    grep_shell三剑客
    awk_shell三剑客
    spring(二)
    spring(一)
    5G的科普
    应用层协议基础
    IP地址相关运算(如VLSM,超网汇总)
    ARP协议基础
  • 原文地址:https://www.cnblogs.com/seniusen/p/11991132.html
Copyright © 2011-2022 走看看