1. 题目
2. 分析
看到最长两个字,第一个想到的就是动态规划,然而动态规划需要确定dp数组的含义,以及递推公式。
再让我们回到题目,题目要求是找到最长的回文子串,首先是回文串的定义为一个可以镜像对称的字符串:例如a,aa,aba,abba;
我们可以发现一个规律:假如首位字符相同,那么最终这个字符串是否回文串就由里面的字符串觉得了,由此我们可以得到:
- dp数组含义从i到j的子串是否回文串
- 公式
- 当a[i] == a[j] 时 当dp[i+1][j-1] > 0 或者 长度 == 2 时 dp[i][j] = dp[i+1][j-1] + 2;
- a[i] != a[j] dp[i][j] = 0;
- 数组初始化,定义长度为1 的全都为回文串
- 我们按照从长度2开始一直到整个字符串的顺序进行遍历
3. 代码
class Solution {
public String longestPalindrome(String s) {
int[][] dp = new int[s.length()][s.length()];
for (int i = 0; i < s.length(); i++) {
dp[i][i] = 1;
}
int max = 1;
int l = 0, r = 0;
for (int i = 2; i <= s.length(); i++) {
for (int j = 0; j <= s.length() - i; j++) {
int t = j + i - 1;
if (s.charAt(j) == s.charAt(t)) {
if (dp[j + 1][t - 1] > 0 || i == 2) {
dp[j][t] = dp[j + 1][t - 1] + 2;
if (dp[j][t] > max) {
max = dp[j][t];
l = j;
r = t;
}
}
}
}
}
return s.substring(l, r + 1);
}
}