問題描述
給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。
示例 1:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。
示例 2:
輸入: "cbbd"
輸出: "bb"
該題目來源於leetcode,點擊進入
解題
public static String longestPalindrome(String s) {
int len = s.length();
// 特判
if (len < 2){
return s;
}
int maxLen = 1;
int begin = 0;
// 1. 狀態定義
// dp[i][j] 表示s[i...j] 是否是迴文串
// 2. 初始化
boolean[][] dp = new boolean[len][len];
for (int i = 0; i < len; i++) {
dp[i][i] = true;
}
char[] chars = s.toCharArray();
// 3. 狀態轉移
// 注意:先填左下角
// 填表規則:先一列一列的填寫,再一行一行的填,保證左下方的單元格先進行計算
for (int j = 1;j < len;j++){
for (int i = 0; i < j; i++) {
// 頭尾字符不相等,不是迴文串
if (chars[i] != chars[j]){
dp[i][j] = false;
}else {
// 相等的情況下
// 考慮頭尾去掉以後沒有字符剩餘,或者剩下一個字符的時候,肯定是迴文串
if (j - i < 3){
dp[i][j] = true;
}else {
// 狀態轉移
dp[i][j] = dp[i + 1][j - 1];
}
}
// 只要dp[i][j] == true 成立,表示s[i...j] 是否是迴文串
// 此時更新記錄迴文長度和起始位置
if (dp[i][j] && j - i + 1 > maxLen){
maxLen = j - i + 1;
begin = i;
}
}
}
// 4. 返回值
return s.substring(begin,begin + maxLen);
}