动态规划算法
代码实现
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]