这题的思路是递归,问题的关键是如何判断一个子串是不是回文子串,我的思路是在主函数外再写一个public static类的静态方法,通过递归判断传入的子串s是不是回文。
判断方法是:如果字符串的首尾相同,那如果去掉首尾是回文子串就是
这只需要递归就可以
但是问题是力扣不让再另外定义一个方法?
这搞得我不想做了,本来这是很自然的很清晰的思路。结果一直卡在这道题上。
看了题解发现这个思路也不太好。因为每次判断的结果都没有保存,因此其实浪费了大量的计算花销
因此列一个二维数组,数组ij表示的是s.substring(i,j)即下标i到j-1这样一个子串,如果是回文那就是true,如果不是那就填false,这样思路还是递归的思路但是简便了很多。
这样的一个矩阵,显然有i<j这是一个上三角矩阵
通过二维数组,艰难地做出来了,花了一个半小时
可是为什么效率这么低
class Solution {
public String longestPalindrome(String s) {
int n=s.length();
if(n==0)
return "";
else if(n==1)
return s;
else if(n==2) {
if (s.charAt(0)==s.charAt(1))
return s;
else return s.substring(0,1);
}else {
//长度大于2构造数组了
boolean d[][]=new boolean[n][n+1];
//这个定义好难受
//先把一些长度为1为2的子串对应的位置填好,用不到的位置我直接不填了
for(int i=0;i<n;i++) {
d[i][i+1]=true;
}
for(int i=0;i<n-1;i++) {
d[i][i+2]=s.charAt(i)==s.charAt(i+1);
}
//至此为止把长度为1和2的都处理好了
for(int length=3;length<=n;length++) {
for(int i=0;i<n-length+1;i++) {
d[i][i+length]=(s.charAt(i)==s.charAt(i+length-1))&&d[i+1][i-1+length];
}
}
int res=1;
String max=s.substring(0,1);
for(int i=0;i<n;i++) {
for(int j=i+1;j<=n;j++) {
if(d[i][j]==true) {
if (j-i>res) {
res=j-i;
max=s.substring(i,j);
}
}
}
}
return max;
}
}
}