StringBuilder strR=new StringBuilder(s).reverse();//倒置 int len=s.length(); int[][] arr=new int[len][len]; int maxlen=0; int startIndex=0; for(int i=0;i<len;i++) { for(int j=0;j<len;j++) { if(s.charAt(i)==strR.charAt(j)) { if(i==0||j==0) arr[i][j]=1;//边界 else arr[i][j]=arr[i-1][j-1]+1; } //len-j-1+arr[i][j]-1==j j(末尾的下标)-(len-j-1)(表示正着的开头下标)+1==arr[i][j](长度) if((len-j-1+arr[i][j]-1==i)&&arr[i][j]>maxlen) { maxlen=arr[i][j]; startIndex=len-j-1; } } } return s.substring(startIndex,startIndex+maxlen);
方法二动态规划:将填表的过程记录下来而不是从头来
二维boolean[][]数组记录是某两位是不是回文串
选取[l,r],s[l]==s[r]之间的字符串如果他是回文串,则[l+1,r-1]也是回文串
//str[l,r] s[l]==s[r] 判断dp[l+1,r-1]是否为真 if(s.isEmpty()) { return ""; } int len=s.length(); int strLen=1; int startIndex=0; boolean[][] dp=new boolean[len][len]; for(int r=0;r<len;r++) { for(int l=0;l<r;l++) { char left=s.charAt(l); char right =s.charAt(r); if(left==right&&((r-l<=2)||dp[l+1][r-1])) { dp[l][r]=true; if((r-l+1)>strLen) { strLen=r-l+1; startIndex=l; } } } } return s.substring(startIndex,startIndex+strLen);
原文:https://www.cnblogs.com/code-fun/p/11437651.html