516.最長迴文子序列

一.  leetcode題目連接spa

https://leetcode-cn.com/problems/longest-palindromic-subsequence/code

二.  動態規劃blog

  1. 樣本:cabbeaf
  2. 狀態轉移

(1) 若是一個字符串S[0,1,2,3,,,n-1],S[0] == S[n-1]那麼最大回文子序列就是leetcode

  P(left,right) = P(left+1,right-1) + 2 left表示字符串的起點,right表示字符串 的終點)字符串

(2) 若是這個字符串S[0]!= S[n-1]get

  P(left,right) = max{ P(left+1,right),p(left,right-1)}string

  1. 邊界

字符串長度爲1 的最大回文子串長度爲1class

  1. 例子

下圖表示,從dp[left][right]這個區間的字符串的最大回文是多大,程序

  好比dp[0][3]表示」cabb」的最大回文子序列長度是2im

  好比dp[1][1]表示」a」的最大回文子序列長度是1

初始化,全部dp[i][i]的迴文子序列長度是本身自己,因此是1,(藍色底部)

開始動態規劃程序:(從左下到右上,按照長度爲2 的字符串,長度爲3,4,5,依次增長)

 

程序:

 public int longestPalindromeSubseq(String s) {
        if (s.length() == 0 || s == null) {
            return 0;
        }
        int length = s.length();
        char[] str = s.toCharArray();
        int[][] dp = new int[length][length];
        for (int i = 0; i < length; i++) {
            dp[i][i] = 1;
        }
        //String maxStr = s.substring(0,0);
        for (int i = 1; i < length; ++i) {
            int tmp = 0;
            for (int j = 0; j + i < length; ++j) {
                if (str[j] == str[i + j]) {
                    tmp = dp[j + 1][i + j - 1] + 2;
                    //這個記錄了最大的子序列,本題中沒用過
                    //maxStr = str[j] + maxStr + str[j];
                } else {
                    tmp = Math.max(dp[j + 1][i + j], dp[j][i + j - 1]);
                }
                dp[j][j + i] = tmp;

            }
        }

        return dp[0][length - 1];
    }
相關文章
相關標籤/搜索