LeetCode -Java 516. 最长回文子序列

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

示例 1:
输入:

"bbbab"

输出:

4

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

示例 2:
输入:

"cbbd"

输出:

2

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

分析:

       最小回文子串:子串是连续的。最小回文子序列:可以去掉几个字符。本题类似最小回文子串,采用动态规划,我们假设dp[ i ] [ j ]表示从S字符串中第i到j最长回文子序列的长度。那么状态转换方程为:

dp[i][j] = max{ dp[i+1][j], dp[i][j-1]}  --S[i] !=S[j]      字符不相等,长度为两端最大值

 dp[i][j] = dp[i+1][j-1]+2;    --S[i] ==S[j]      字符相等,长度为内侧子串长度+2

代码:

import java.util.*;

/**
 * @author: Mr.Hu
 */
public class Main{

    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        System.out.println(longestPalindrome(sc.next()));

    }
    public static int longestPalindrome(String s) {
        if (s.length()==0) return 0;
        int dp[][]=new int[s.length()][s.length()]; //记录回文子序列长度
        for (int i = 0; i < s.length(); i++) { //初始化长度为1和2的dp
            dp[i][i]=1;
            if (i

 

你可能感兴趣的:(LeetCode)