给定一个字符串 s,找到 s 中最长的回文子串。你可以假设s 的最大长度为 1000。
输入:"babad" 输出:"bab"注意:"aba" 也是一个有效答案。
输入:"cbbd" 输出:"bb"
可以利用中心扩散法来解决该问题,先写一个函数getLen,用于获得从传入下标可扩散到的最广范围,因为当跳出循环时需将左右边界收紧一格,若传入的下标相邻则返回的左下标将大于右下标,为了避免之后调用substring时出现异常,当r-l<2时,返回{0,0}(此时回文串长度为0,返回范围内的任意值均可)。
之后对数组中每个元素以及每个空隙均调用该函数即可。
class Solution {
public int[] getLen(String s,int l,int r){
while(l>=0&&r<s.length())
{
if(s.charAt(l)==s.charAt(r)){
l--;
r++;
}else{
if(r-l>=2){
return new int[]{l+1,r-1};
}else{
return new int[]{0,0};
}
}
}
if(r-l>=2){
return new int[]{l+1,r-1};
}else{
return new int[]{0,0};
}
}
public String longestPalindrome(String s) {
String ans="";
int maxlen=0;
for(int i=0;i<s.length();i++){
int[] num1=getLen(s,i-1,i+1);
int[] num2=getLen(s,i,i+1);
if(num1[1]-num1[0]+1>maxlen){
maxlen=num1[1]-num1[0]+1;
ans=s.substring(num1[0],num1[1]+1);
}
if(num2[1]-num2[0]+1>maxlen){
maxlen=num2[1]-num2[0]+1;
ans=s.substring(num2[0],num2[1]+1);
}
}
return ans;
}
}