最长回文子序列(教你由暴力递归改动态规划)

package 左神题目.dp;
//给定--个字符串str,返回这个字符串的最长回文子序列长度比如str = "a12b3c43def2ghi1kpm”
// 最长回文子序列是“1234321" 或者“123c321"返回长度7
import java.util.Scanner;
//做动态规划,最好做出严格表依赖结构,建立空间感,方便优化
//动态规划一定是递归改出来的,但是递归不一定能改动态规划
public class longestPalindromeSubseq {
    //1.反转字符串,然后求两个字符串的最长公共子序列
    //怎么求最长公共子序列,请看上一篇文章
    public static int win1(String s){
        //字符串反转
        String s2 =new StringBuilder(s).reverse().toString();

        char[] str1 = s.toCharArray();
        char[] str2 = s2.toCharArray();

        int N=str1.length;
        int[][] dp = new int[N][N];

        dp[0][0] = str1[0]==str2[0]?1:0;
        for(int j=1;j p1 = process(str,l+1,r-1);
//                int p2 = dp[l][r-1];  // --> p2 = process(str,l,r-1);
//                int p3 = dp[l+1][r]; // -->  p3 = process(str,l+1,r);
//                int p4 = str[l]==str[r]?2+p1:0; // -->p4 = str[l]==str[r]?(2+process(str,l+1,r-1)):0;
//
//                dp[l][r]=Math.max(p1,Math.max(p2,Math.max(p3,p4)));
//            }
//        }

        //行 从下往上填
//        for(int l = N-3;l>=0;l--){
//            //列
//            for(int r = l+2;r p =str[l]==str[r]? 2+dp[l+1][r-1]:dp[l+1][r-1];
//                dp[l][r]=Math.max(p1,Math.max(p2,Math.max(p3,p4)));
//            }
//        }

        for(int l = N-3;l>=0;l--){
            for(int r = l+2;r

你可能感兴趣的:(左神的上课题,动态规划,leetcode)