回文子串
给你一个字符串 s
,找到 s
中最长的回文子串
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
1 2 3
| 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
|
示例 2:
答案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| package huiwen;
public class longestPalindrome { public String longestPalindromeSolve(String s) { int len = s.length(); if (len < 2){ return s; } int maxLen = 1; int begin = 0; boolean[][] dp = new boolean[len][len]; for(int i = 0; i < len; i++){ dp[i][i] = true; }
char[] charArray = s.toCharArray(); for (int L = 2 ; L <= len; L++){ for (int i = 0; i <= len - L; i++){
int j = L+i-1; if (charArray[i] != charArray[j]){ dp[i][j] = false; }else { if (j-i<3){ dp[i][j] = true; }else { dp[i][j] = dp[i+1][j-1]; } } if (dp[i][j] && j-i+1 > maxLen){ maxLen = j-i+1; begin = i; } } } return s.substring(begin,begin+maxLen); } }
|
回文子序列
给你一个字符串 s
,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
1 2 3
| 输入:s = "bbbab" 输出:4 解释:一个可能的最长回文子序列为 "bbbb" 。
|
示例 2:
1 2 3
| 输入:s = "cbbd" 输出:2 解释:一个可能的最长回文子序列为 "bb" 。
|
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public int longestPalindromeSubseq(String s){ int n = s.length(); int[][] dp = new int[n][n]; for (int i = 0; i < n; i++){ dp[i][i] =1; } for (int len = 2; len <= n ; len++){ for (int i = 0; i <= n-len; i++){ int j = i+len-1; char c1 = s.charAt(i), c2 =s.charAt(j); if(c1 == c2){ dp[i][j] = dp[i+1][j-1]+2; }else{ dp[i][j] = Math.max(dp[i][j-1],dp[i+1][j]); } } } return dp[0][n - 1]; }
|
两者区别地方
1 2 3 4 5 6 7
| if(c1 == c2){ dp[i][j] = dp[i+1][j-1]+2; }else{ dp[i][j] = Math.max(dp[i][j-1],dp[i+1][j]);
|