题目描述:
给你一个字符串 s
,找到 s
中最长的回文子串。
解题思路:由回文的性质可以知道,一串字符如果是回文的,name左右两侧加上相同的字符,它还是回文的。如abcba是回文的,那么dabcbad和bcb都是回文的,由此可以得到动态规划状态转移方程dp[i][j] = dp[i+1][j-1];其中i,j为数组下标。下面就是找初始值了,回文数组一直减掉左右两边最后只剩最里面的一个或者两个(奇数就是一个,偶数就是两个,不可能减到0,那就不是回文结构了),此时就是方程的边界了,也就是初始值,题目给出定义,只有一个字符也是回文结构,两个字符如果相等就是回文结构。下面就是写代码了。
代码实现如下:
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if (s.length() < 2) return s;
int maxLength = 1;
int begin = 0;
boolean[][] dp = new boolean[len][len];
//初始化
for (int i = 0;i < len;i++) {
dp[i][i] = true;
}
char[] str = s.toCharArray();
//开始枚举子串长度
for (int l = 2;l <= len;l++) {
//子串长度为l时,遍历数组
for (int i = 0;i < len;i++) {
int j = l + i - 1;//j为右边界,i为左边界,l = j - i + 1 变形得出j的长度。
//j超过数组长度就结束本趟循环
if (j >= len) {
break;
}
//左右对称的位置的值不相等就false
if (str[i] != str[j]) {
dp[i][j] = false;
} else {//此时进入条件的都是左右相等的
//长度为1或者2的左右相等的就是回文数组
if (j - i < 3) {
dp[i][j] = true;
} else {
//动态规划的状态转移方程,长度大于2的时候,判断左右向里面各走一步的数组
dp[i][j] = dp[i + 1][j - 1];
}
}
//走到这里就是回文子数组,此时判断长度并做记录。
if (dp[i][j] && j - i + 1 > maxLength) {
maxLength = j - i + 1;
begin = i;
}
}
}
return s.substring(begin,begin + maxLength);
}
}