问题描述
给定一个字符串
s
,找到s
中最长的回文子串。你可以假设s
的最大长度为 1000。
示例
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。
问题分析
回文串的意思是“从前往后读和从后往前读是一样的”,举个简单的例子“上海自来水来自海上”。
所以这里我们可以将原字符串反转,求两个字符串的最长公共子序列。
例如:abbc 的反转 cbba,他们的最长公共子序列就是“bb”也就是所求。通过反转之后求最长公共子序列来模拟从前往后和从后往前读取的过程。
这里需要特别注意的一点是 不是所有的公共子序列一定满足条件。例如字符串 abcdba,它的反转abdcba 和它的最长公共子序列为"ab",但是显然ab不是答案所求。所以我们在判断的时候一定要检查最长公共子序列在原字符串中的索引,是否对应的就是反转后的那一块索引
公共最长子序列法
public String longestPalindrome(String s) {
if (s.isEmpty() || s.length() == 1) {
return s;
}
char[] a = s.toCharArray();
int l = a.length;
int[][] temp = new int[l][l];
int max = 0, index = 0;
for (int i = 0; i < l; i++) {
for (int j = 0; j < l; j++) {
if (a[i] == a[l - j - 1]) {
if (i > 0 && j > 0) {
temp[i][j] = temp[i - 1][j - 1] + 1;
} else {
temp[i][j] = 1;
}
if (max < temp[i][j] && l - 1 - i == j - temp[i][j] +