一. leetcode題目連接spa
https://leetcode-cn.com/problems/longest-palindromic-subsequence/code
二. 動態規劃blog
(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 的最大回文子串長度爲1class
下圖表示,從dp[left][right]這個區間的字符串的最大回文是多大,程序
好比dp[0][3]表示」cabb」的最大回文子序列長度是2。im
好比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]; }