Leetcode 516. Longest Palindromic Subsequence

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:spa

"bbbab"

Output:code

4

One possible longest palindromic subsequence is "bbbb".blog

 

Example 2:
Input:遞歸

"cbbd"

Output:leetcode

2

One possible longest palindromic subsequence is "bb".字符串

 

Similar Questions: Longest Palindromic Substring Palindromic Substrings get

Next challenges: Coin Change Integer Break Target Sumstring

 

 方法一:迭代。io

思路:dp[i][j]表示的字符串i位置到j位置之間(包括i,j)含有的palindromic subsequence的數目,那麼有若是s[i]==s[j],那麼dp[i][j]=dp[i+1][j-1]+2;不然dp[i][j]=max(dp[i+1][j],dp[i][j-1])。具體實現的時候,應該先肯定i和j位置之間(不包含i和j)的全部短字符串中的palindromic subsequence的數目,而後再求dp[i][j]。

 

代碼:

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

 

 

方法二:遞歸。

思路和方法一相同。

代碼:

 1 public class Solution {
 2     public int longestPalindromeSubseq(String s) {
 3         return helper(s, 0, s.length() - 1, new Integer[s.length()][s.length()]);
 4     }
 5     
 6     private int helper(String s, int i, int j, Integer[][] memo) {
 7         if(memo[i][j] != null) return memo[i][j];//初始化Integer數組,因此數組中的每一個元素是個類,若是類沒有初始化就是null
 8         if(i > j) return 0;
 9         if(i == j) return 1;
10         if(s.charAt(i) == s.charAt(j)) memo[i][j] = helper(s, i + 1, j - 1, memo) + 2;
11         else memo[i][j] = Math.max(helper(s, i, j - 1, memo), helper(s, i + 1, j, memo));
12         return memo[i][j];
13     }
14 }
相關文章
相關標籤/搜索