给你一个字符串
s
,找到s
中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2:
输入:s = "cbbd" 输出:"bb"提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
动态规划 找出状态转移方程 使用数组记录 从数组中查出结果
边界情况,如果字符串中只有一个字符,它一定是一个回文字符串,如果这个字符串有两个字符,判断这两个字符串是否相等,如果相等则这个字符串是回文字符串。这就列出了两个边界条件.
当有多个字符时,如果字符串i-j是回文字符串,如果第i-1个字符串等于第j+1个字符串,则字符串i-1到j+1是回文字符串,可以列出状态转移方程
public String longestPalindrome(String s) {
int len = s.length();
if (len < 2){
return s;
}
int maxLen = 1;
int begin = 0;
boolean[][] dp = new boolean[len][len];
for (int i = 0;i < len;i++){
dp[i][i] = true;
}
char[] charArray = s.toCharArray();
for (int L = 2;L <= len;L++){
for (int i = 0; i < len;i++){
int j = L + i - 1;
if (j >= len){
break;
}
if (charArray[i] != charArray[j]){
dp[i][j] = false;
}else {
if (j - i < 3){
dp[i][j] = true;
}else {
dp[i][j] = dp[i + 1][j - 1];
}
}
if (dp[i][j] && j - i + 1 > maxLen){
maxLen = j - i + 1;
begin = i;
}
}
}
return s.substring(begin,begin + maxLen);
}