难度:中等
频率:117
题目:给你一个字符串 s,找到 s 中最长的回文子串。
解题方法:中心拓展法
- 1.如果string为奇数,那么是单中心拓展。
- 2.如果为偶数,那么是双中心拓展。
- 3.返回值为回文子串长度
- 4.根据长度和中心,找到子串
class Solution {
public String longestPalindrome(String s) {
int len=s.length();
if(len<=1) return s;
int [] res=new int[2];
int maxlen=0;
//for循环不能要i和i+1越界。
for(int i=0;i<len-1;i++){
int [] odd=centerspread(s,i,i);
int [] even=centerspread(s,i,i+1);
int [] max=odd[1]>even[1]?odd:even;
if(max[1]>maxlen){
res=max;
maxlen=max[1];
}
}
return s.substring(res[0],res[0]+res[1]);
}
//函数返回值是 一个数组{第一位:起始下标,第二位:长度}
public int[] centerspread(String s,int left,int right){
int len=s.length();
while(left>=0&&right<=len-1){
//这里的方法需要多记住
if(s.charAt(left)==s.charAt(right)){
right++;
left--;
}
else{
break;
}
}
return new int[]{left+1,(right-1)-(left+1)+1}; // 这里的left和right多走了一位
}
}
注意:
- 多写一个函数每次固定中心后算出的最大回文数
- 这里要记得s.charAt(下标)
- 函数返回值是 一个数组{第一位:起始下标,第二位:长度}
- 最后的right和left是多走了一步的
- 因为不知道最大回文是奇数长度还是偶数长度,所以都算,然后取最长。从中心0到i-2都要遍历。
- for循环里i和i+1不能越界