zoukankan      html  css  js  c++  java
  • LeetCode 516. Longest Palindromic Subsequence

    516. Longest Palindromic Subsequence

    Description Submission Solutions

    • Total Accepted: 2159
    • Total Submissions: 5216
    • Difficulty: Medium
    • Contributors: Stomach_ache

     Given a string s, find the longest palindromic subsequence's length in s. You may assume that the maximum length of s is 1000.

    Example 1:
    Input:

    "bbbab"
    
    Output:
    4
    
    One possible longest palindromic subsequence is "bbbb".

     Example 2:

    Input:

    "cbbd"
    
    Output:
    2
    
    One possible longest palindromic subsequence is "bb". 

    Subscribe to see which companies asked this question.

    【题目分析】

    给定一个字符串,返回字符串中包含的最长的回文子串。

    【思路】

    这是一个动态规划的题目,对于动态规划的题目,我们首先要明确这个大问题如何用子问题来表示,然后分情况写出动态规划的递归表达式,这样编程实现就简单多了。

    1. 子问题的解如何表达?

    给定一个字符串,把它划分成什么样的子问题呢?通过分析我们发现,这样的子问题是:任意一个该字符串的子串包含的回文串的长度,那么对于这个字符串的子串,我们可以用它在原字符串中的起始位置和结束位置来表示。因此,我们可以用一个二维数组来对子问题进行表示,dp[i][j]表示he longest palindromic subsequence's length of substring(i, j)。

    2. 大问题如何用子问题来表示?

    dp[i][j] = dp[i+1][j-1] + 2 if s.charAt(i) == s.charAt(j)
    otherwise, dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1])
    Initializationdp[i][i] = 1

    通过上面的分析,我们已经知道了该如何解决这个问题。

    【java代码】——循环的方式

     1 public class Solution {
     2     public int longestPalindromeSubseq(String s) {
     3         int len = s.length();
     4         int[][] dp = new int[len][len];
     5         
     6         for(int i = len-1; i >= 0; i--) {
     7             dp[i][i] = 1;
     8             for(int j = i+1; j < len; j++) {
     9                 if(s.charAt(i) == s.charAt(j)) {
    10                     dp[i][j] = dp[i+1][j-1] + 2;
    11                 }
    12                 else {
    13                     dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
    14                 }
    15             }
    16         }
    17         
    18         return dp[0][len-1];
    19     }
    20 }

     【java代码】——递归的方式(效率很高)

     1 public class Solution {
     2     public int longestPalindromeSubseq(String s) {
     3         return helper(s, 0, s.length() - 1, new int[s.length()][s.length()]);
     4     }
     5     
     6     private int helper(String s, int i, int j, int[][] memo) {
     7         if (memo[i][j] != 0) {
     8             return memo[i][j];
     9         }
    10         if (i > j)      return 0;
    11         if (i == j)     return 1;
    12         
    13         if (s.charAt(i) == s.charAt(j)) {
    14             memo[i][j] = helper(s, i + 1, j - 1, memo) + 2;
    15         } else {
    16             memo[i][j] = Math.max(helper(s, i + 1, j, memo), helper(s, i, j - 1, memo));
    17         }
    18         return memo[i][j];
    19     }
    20 }

  • 相关阅读:
    黑盒测试和白盒测试的区别
    alpha测试和beta测试的区别
    selenium退出语句区别
    QTP8.2--安装流程
    Xshell无法连接Linux虚拟机问题
    Linux-----centos6.2---安装Linux的流程
    MySql错误处理--错误代码和消息
    基于Linux系统--web环境搭建
    前端底层-作用域 this 原型笔试题练习
    前端底层-冒泡与捕获
  • 原文地址:https://www.cnblogs.com/liujinhong/p/6418192.html
Copyright © 2011-2022 走看看