5. 最长回文子串
5. 最长回文子串
1.状态定义
//dp[i][j]表示s[i…j]是否为回文串
2.状态转移方程
dp[i][j] = (s[i] == s[j]) && dp[i + 1][j - 1]
3.边界值处理
dp[i][i] = true
class Solution { public String longestPalindrome(String s) { int len = s.length(); if(len < 2) return s; int maxLen = 1; int begin = 0; //dp[i][j]表示s[i…j]是否为回文串 boolean[][] dp = new boolean[len][len]; for(int i = 0; i < len; i++) dp[i][i] = true; char[] charArray = s.toCharArray(); for(int j = 1; j < len; j++) { for(int i = 0; i < j; i++) { //左右边界不相等,必不可能为回文串 if(charArray[i] != charArray[j]) dp[i][j] =false; //左右边界相等的情况下 else { //i, j索引差小于3, i + 1 和 j - 1索引差小于1(0 或-1) //为0时s[i + 1 .. j - 1]长度为1,为-1时长度为0,此时左右边界相等即为回文串 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); } }