package algorithm;
/*
*最长的回文子串
*概念:回文串:即正读和反读都一样的字符串,比如"level"、"noon"、aa、baab等等。其中aa长度为2也是回文串
*
*
对于字符串str,假设dp[i,j]=1(表示为真),表示字符串str[i...j]是回文串,
那么必定dp[i+1,j-1]=1(表示为真)。此可分解为一系列的子问题,可以利用动态规划求解。
dp[i,j]=dp[i+1,j-1]且str[i]=str[j]
如果str[i]!=str[j],则dp[i][j]=0
单个字符是回文串,即dp[i][i]=1
两个相同字符是回文串,即dp[i][i+1]=1,此时str[i]=str[i+1]
* */
//https://www.cnblogs.com/xiuyangleiasp/p/5070991.html
public class LongestPalindromicSubstring {
public static int longestPalindromicSubstring(String str) {
if (str == null || str.equals("")) {
return 0;
}
int length = str.length();
System.out.println("长度为:" + length);
int[][] dp = new int[length][length]; //初始值都为0
//System.out.println("dp[0][0]="+dp[0][0]+"----"+(dp[0][0]==dp[1][1]));
int longest=1;
for (int i = 0; i < length; i++) { //数据初始化,跳转1步,2步
dp[i][i] = 1; //单个字符串是回文串
char t1 = str.charAt(i);
if (i + 1 >= length) { //不可超越边界
continue;
}
char t2 = str.charAt(i + 1);
if (t1 == t2) { // 连续2个相同的字符串也是回文串
dp[i][i + 1] = 1;
longest=2;
}
}
//**************多步跳转********
for(int skip=2;skip<length;skip++){ //跳转3步,此为0,1,2下标。
for(int i=0;i+skip<length;i++){//-----------------1
int j=i+skip;
char t1 = str.charAt(i);
char t2 = str.charAt(j);
if(t1==t2){
dp[i][j]=dp[i+1][j-1];
if(dp[i][j]==1){
int tmp=j-i+1;
if(tmp>longest){
longest=tmp;
printStr(str,i,j);
}
}
}
}//-----------------1
}
/* XXX 下面方法不可行,因中间需要的dp中间值,中间没有核算正确,,,,--不可行
for(int i=0;i<length;i++){
for(int j=i+2;j<length;j++){
char t1 = str.charAt(i);
char t2 = str.charAt(j);
if(t1==t2){
dp[i][j]=dp[i+1][j-1];
if(dp[i][j]==1){
int tmp=j-i+1;
if(tmp>longest){
longest=tmp;
printStr(str,i,j);
}
}
}
}
}*/
System.out.println("最长为"+longest);
return longest;
}
public static void printStr(String str,int i,int j){
System.out.println(str+" i="+i+" j="+j);
System.out.println("--------------输出为:--------");
for(int t=i;t<=j;t++){
System.out.print(str.charAt(t));
}
System.out.println();
System.out.println("--------------end--------");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "abcdefedcba";
//str="level";
//str="aa";
long result=longestPalindromicSubstring(str);
System.out.println("最长回文串为result="+result);
}
}
7782

被折叠的 条评论
为什么被折叠?



