import java.util.Arrays;
public class test200
{
public static void main(String[] args)
{
String s="xabbac";
int a=longestPalindrome(s);
System.out.println();
}
public static int longestPalindrome(String s)
{
char[] carr=s.toCharArray();
int[][] dp=new int[carr.length][carr.length];
for(int i=0;i<carr.length;i++)
Arrays.fill(dp[i], -1);
return dp(0, carr.length-1, carr,dp);
}
public static int dp(int a,int b,char[] carr,int[][] dp)
{
if(dp[a][b]>-1)
return dp[a][b];
if(a==b)
return dp[a][b]=1; // "aba" <- "a"
if(a>b)
return dp[a][b]=0; // "bb" <- ""
if(carr[a]==carr[b])
if(check(a+1, b-1, carr))
return dp[a][b]=dp(a+1, b-1, carr,dp)+2;
return dp[a][b]=Math.max(dp(a+1, b, carr,dp),dp(a, b-1, carr,dp));
}
public static boolean check(int a,int b,char[] carr)
{
if(a>=b)
return true;
if(carr[a]!=carr[b])
return false;
return check(a+1, b-1, carr);
}
}
-----------------------------------------------------------------------------------------------------------------------------------
输出串
import java.util.Arrays;
public class test200
{
public static void main(String[] args)
{
String s="ababbababauiopjsjsjsjsjsjx";
String ss=longestPalindrome(s);
System.out.println(ss);
}
public static String longestPalindrome(String s)
{
char[] carr=s.toCharArray();
int[][] dp=new int[carr.length][carr.length];
int[][] start=new int[carr.length][carr.length];
for(int i=0;i<carr.length;i++)
Arrays.fill(dp[i], -1);
int len=dp(0, carr.length-1, carr,dp,start);
String ss=s.substring(start[0][carr.length-1], start[0][carr.length-1]+len);
return ss;
}
public static int dp(int a,int b,char[] carr,int[][] dp,int[][] start)
{
if(dp[a][b]>-1)
return dp[a][b];
if(a==b)
{
start[a][b]=a;
return dp[a][b]=1;
}
if(a>b)
{
start[a][b]=a;
return dp[a][b]=0;
}
if(carr[a]==carr[b])
if(check(a+1, b-1, carr))
{
start[a][b]=a;
return dp[a][b]=dp(a+1, b-1, carr,dp,start)+2;
}
int m=dp(a+1, b, carr,dp,start);
int n=dp(a, b-1, carr,dp,start);
int ret=m;
if(m>n)
start[a][b]=start[a+1][b];
else {
start[a][b]=start[a][b-1];
ret=n;
}
return dp[a][b]=ret;
}
public static boolean check(int a,int b,char[] carr)
{
if(a>=b)
return true;
if(carr[a]!=carr[b])
return false;
return check(a+1, b-1, carr);
}
}