解题思路:
dp[i][j]表示字符串索引从i~j之间是否为最长回文子序列(长度)
状态转移方程
dp[i][j] = dp[i+1][j-1]+1 if(str[i]==str[j])
max(dp[i+1][j],dp[i][j-1]) if(str[i]!=str[j])
边界
dp[i][i] = 1
dp[i][i+1] = 2 if(str[i]==str[i+1])
public class FindLongestPalindrome {
public static void main(String[] args) {
// Scanner scanner = new Scanner(System.in);
// String inputStr = scanner.nextLine();
String inputStr = "asdffdsasdfsdfsdffdsfdsfdsa";
int length = inputStr.length();
int maxLen = 0;
int start = 0;
boolean[][] dp = new boolean[50][50];
for(int i=0;i<length;i++){
dp[i][i] = true;
if(i<length-1&&inputStr.charAt(i)==inputStr.charAt(i+1)){
dp[i][i+1] = true;
start = i;
maxLen = 2;
}
}
for(int len = 3;len<length;len++){//子串长度
for(int i=0;i<=length-len;i++){//子串起始的地址
int j = i+len-1;//子串结束位置
if(dp[i+1][j-1]==true&&inputStr.charAt(i)==inputStr.charAt(j)){
dp[i][j]=true;
maxLen = len;
start = i;
if(maxLen>=5){
System.out.println(inputStr.substring(start, start+maxLen));
}
}
}
}
}
}