动态规划算法
代码实现
class Solution {
public String longestPalindrome ( String s) {
int len = s. length ( ) ;
int begin = 0 ;
int maxLen = 0 ;
int flag = 0 ;
char [ ] charArray = s. toCharArray ( ) ;
boolean [ ] [ ] dp = new boolean [ len] [ len] ;
for ( int i= 0 ; i< len; i++ ) {
dp[ i] [ i] = true ;
}
for ( int i= 0 ; i< len- 1 ; i++ ) {
if ( charArray[ i] == charArray[ i+ 1 ] ) {
dp[ i] [ 1 + i] = true ;
maxLen = 1 ;
if ( flag == 0 ) {
begin = i;
flag = 1 ;
}
} else {
dp[ i] [ 1 + i] = false ;
}
}
for ( int i= 2 ; i< len; i++ ) {
for ( int j= 0 ; j< len- i; j++ ) {
if ( charArray[ j] == charArray[ j+ i] ) {
dp[ j] [ j+ i] = dp[ j+ 1 ] [ j+ i- 1 ] ;
if ( i> maxLen && dp[ j] [ j+ i] ) {
begin = j;
maxLen = i;
}
} else {
dp[ j] [ j+ i] = false ;
}
}
}
return s. substring ( begin, begin + maxLen + 1 ) ;
}
}
思路分析
想象一下判断一个串是否是一个回文,最简单的一个过程是找到第 i 个元素,然后比较第i-1 个元素和第i+1 个元素是否相同,以此类推 用dp[i][j]代表字符串 s 的第 i 到 j 个字母组成的串是否为回文串,dp数组为布尔类型,显然dp[i][j]=dp[i+1][j-1] && charArray[i]== charArray[j] 需要考虑特殊情况,比如dp[i][i]和dp[i][i+1]