问题
给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
例如 "babbad" 的最长回文子串是"abba"
解答
二维动态规划方法
这个方法在我看来应该是最直观的一个方法
回文串两边加上相同的字符,就会形成一个新的回文串
建立二维数组 dp
,找出所有的回文子串。
dp[i][j]
记录子串 i..j
是否为回文串 。
这里其实主要是明白一个概念
那就是当 dp[i][j]等于true的时候,dp[i+1][j-1]也等于true
也就是说 当 dp[i][j] 两个为回文子串的时候,dp[i+1][j-1]也为回文子串的时候,
那么 bp[i -> j] 就是回文子串
public String longestPalindrome(String s) {
if (s==null){
return null;
}
//定义一个二维数组
char[] chars = s.toCharArray();
int length = chars.length;
// 第一维参数表示起始位置坐标,第二维参数表示终点坐标
// bp[i][j] 表示以 i 为起始坐标,j 为终点坐标是否为回文子串
boolean[][] bp = new boolean[length][length];
// 记录最长回文子串最长长度
int maxLen = 1;
// 记录最长回文子串起始位置
int start = 0;
for (int j = 0; j < length; j++) {
for (int i = 0; i <= j; i++) {
//判断长度小于2的情况
if (j-i<2){
bp[i][j] = chars[i] == chars[j];
} else {
bp[i][j] = bp[i+1][j-1] && chars[i] == chars[j];
}
//跟现有的长度进行对比
if (bp[i][j] && j-i+1>maxLen){
maxLen = j-i+1;
start = i;
}
}
}
return s.substring(start, start + maxLen);
}