问题链接:5. 最长回文子串
问题描述:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
解题思路:
创建一个二维boolean类型的数组dp[ i , j ],dp[ i , j ]表示的是s[ i , j ]是否为回文串,在字符串中先找到两个相同的字符(假设这两个字符下标分别为i ,j),再判断这两个字符之间的字符串是否为回文串。
状态转移:
- 如果 j - i < 3( 字串包括了 i 和 j ),说明了 i,j 之间就只有一个字符,或者没有字符,这时候s[ i , j ]必定是个回文串,dp[i][j]=true。
- 如果 j - i >= 3 ,那么此时就不能直接判断s[ i , j ]是否为回文串了,此时就要判断 i , j 之间的子串是否为回文串,若是,那么s[ i , j ]就是回文串,否则,s[ i , j ]就不是回文串,既:dp[i][j]=dp[i+1][j-1]。
总结:状态转移方程为:
题解:
class Solution5 {
public String longestPalindrome(String s) {
int len = s.length();
if(len<2) {
return s;
}
int maxLen=1;
int begin=0;//设置要返回的字串的起始下标
char[] chars = s.toCharArray();
boolean[][] dp = new boolean[len][len];
for(int i=0 ; i<len ; i++) {
dp[i][i]=true;
}
for(int j=1; j<len ; j++) {
for(int i=0 ; i<j ; i++) {
if(chars[j]==chars[i]) {
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;
}
}else
dp[i][j]=false;
}
}
return s.substring(begin,begin+maxLen);
}
}