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

    最长回文子序列

    给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。

    示例 1:
    输入:

    "bbbab"

    输出:

    4

    一个可能的最长回文子序列为 "bbbb"。

    示例 2:
    输入:

    "cbbd"

    输出:

    2

    一个可能的最长回文子序列为 "bb"。

     

    思路解析

    分治算法去解决这道题是第一思路,即对于一个长度为n的字符串,对应于一个分治算法的状态数组dp[n-1][n-1],该数组的值对应字符串中最长回文子序列的长度,如dp[i][j]则代表着字符串中第i位到第j位的子序列中的最长回文子序列长度为dp[i][j],明确这一点后,我们要作的即为求出dp[0][n-1]的值并输出即可。

    利用分治算法的思想,当某子串s(i,j)中s[i]与s[j]相等时,那么其头尾两字符一定位于其最长回文子串中,因此该子串的最长回文子序列长度等于去掉头尾两字符后新子串的最长回文子序列长度加二,我们可制定公式如下:dp[i][j] = dp[i + 1][j - 1] + 2。当s[i]与s[j]不相等时,则dp[i][j] = max(de[i + 1][j],dp[i][j - 1])。有了这个规则,我们接下来只需要遍历出该字符串s的每一个子串,即dp数组中的每一个值,最终输出dp[0][n-1]。

     

     

     1 class Solution {
     2     public int longestPalindromeSubseq(String s) {
     3         int len=s.length();
     4         int[][] dp=new int[len][len];
     5         if(len==0||len==1) return len;
     6         for(int j=0;j<len;j++){
     7             dp[j][j]=1;
     8             for(int i=j-1;i>=0;i--){
     9                 if(s.charAt(i)==s.charAt(j)){
    10                     dp[i][j]=dp[i+1][j-1]+2;
    11                 }else{
    12                     dp[i][j]=Math.max(dp[i+1][j],dp[i][j-1]);
    13                 }
    14             }
    15         }
    16         return dp[0][len-1];
    17     }
    18 }
  • 相关阅读:
    jquery基础整理(面试必备)
    ES中文学习指南---入门篇
    ES的Java Rest client---jest
    java学习路线
    ES中文学习指南一-----产品体验
    Tomcat无法启动
    Maven问题集
    informatica9.5.1资源库为machine in exclusive mode(REP_51821)
    程序员书单_架构设计篇
    Informatica9.6.1在Linux Red Hat 5.8上安装遇到的有关问题整理_1
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10372524.html
Copyright © 2011-2022 走看看