• LeetCode 516. Longest Palindromic Subsequence


    问题链接

    LeetCode 516

    题目解析

    求最长回文子序列。

    解题思路

    子序列和子串有区别的,子序列不需要连续,相对位置递增即可。

    动态规划。对于任意字符串,如果头尾字符相同,那么字符串的最长回文子序列等于去掉首尾的字符串的最长回文子序列加上首尾;如果首尾字符不同,则最长子序列等于去掉头的字符串的最长子序列和去掉尾的字符串的最长子序列的较大者。

    因此动态规划的状态转移方程为:

    设字符串为str,长度为n,dp[i][j]表示第i到第j个字符间的回文子序列的最大长度(i<=j),则:

    状态初始条件:dp[i][i]=1 (i=0:n-1)

    状态转移方程:

      dp[i][j]=dp[i+1][j-1] + 2  if(str[i]==str[j])
    
      dp[i][j]=max(dp[i+1][j],dp[i][j-1])  if (str[i]!=str[j])
    

    你可能已经发现,这和LCS的状态转移几乎没什么两样,没错,最长回文子序列LPS其实就是最长公共子序列LCS,为什么呢?你想一下,如果把字符串反转,看作第二个字符串,那我要求的,不就是这两个字符串的LCS吗?对不对,对不对!

    参考代码

    class Solution {
    public:
        int longestPalindromeSubseq(string s) {
            vector<vector<int>> dp(s.length(),vector<int>(s.length()));
            for(int i=s.length()-1;i>=0;i--)
            {
                dp[i][i]=1;
                for(int j=i+1;j<s.length();j++)
                {
                    if(s[i]==s[j])
                        dp[i][j]=dp[i+1][j-1]+2;
                    else
                        dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
                }
            }
            return dp[0][s.length()-1];
        }
    };
    

    LeetCode All in One题解汇总(持续更新中...)

    本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


  • 相关阅读:
    NTFS的交换数据流ADS应用
    解决binwalk运行提示缺少LZMA模块
    蓝牙扫描工具btscanner修复暴力扫描模式
    iOS 11开发教程(二十)iOS11应用视图美化按钮之设置按钮的状态
    Visual Studio 2017 版本 15.5.5
    iOS 11开发教程(十九)iOS11应用视图美化按钮之设置按钮的外观
    jquery的基本api
    vue知识点总结
    历史记录
    http加密原理
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/8528975.html
Copyright © 2020-2023  润新知