给定一个字符串,求其最长的回文子串的长度。如字符串"abcdcba"的最长回文子串长度为7,而"aebfcgdhcibja"的最长回文也是"abcdcba",长度也是7.
分析:典型的动态规划问题,用dp[i][j]记录字符串中从字符 i 到字符 j 中最长回文子串的长度,则
if (s.charAt(i) == s.charAt(j)) {
dp[i][j] = dp[i + 1][j - 1] + 2;
} else {
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
}
public int longestPalindromeSubseq(String s) {
int[][] dp = new int[s.length()][s.length()];
for(int i = 0; i < s.length(); i++) {
dp[i][i] = 1;
}
for (int l = 1; l < s.length(); l++) { //长度从1开始
for (int i = 0; i + l < s.length(); i++) {
int j = i + l;
if (s.charAt(i) == s.charAt(j)) {
dp[i][j] = dp[i + 1][j - 1] + 2;
} else {
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
}
}
}
return dp[0][s.length()-1];
}
或者从后往前循环:
public int longestPalindromeSubseq(String s) {
int[][] dp = new int[s.length()][s.length()];
for (int i = s.length() - 1; i >= 0; i--) {
dp[i][i] = 1;
for (int j = i+1; j < s.length(); j++) {
if (s.charAt(i) == s.charAt(j)) {
dp[i][j] = dp[i+1][j-1] + 2;
} else {
dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
}
}
}
return dp[0][s.length()-1];
}