目录
题目
给你一个字符串 s,找到 s 中最长的回文子串。
思路
一开始见到这个题目,我一想到的就是暴力法,直接遍历,然后寻找,大概的思路就是先确定哪一部分是最长的回文子串,拿到它的下标,然后,就是利用下标去切割字符串,返回结果,最难的部分,当然是确定下标。
确定下标
- 如果这个字符串的长度是一位,直接返回
- 大于两位的,利用循环开始一 一的遍历,初始化认为最长的回文子串,字母之间的下标差为1,就像"aa"这个字符串一样,下标差为1。
遍历的思路是这样的:第一轮循环:下标是0的跟下标是1的比较,下标是1的跟下标是2的比,直到倒数第二和倒数第一比,然后利用一个数组来记录它们的比较结果,第二轮是下标是0和下标是2的相比,。。。以此类推,每轮都记录谁是回文子串,记录最大的下标差
切割字符串
全部的循环完之后,我们就可以得出最大的下标差了,利用这个下标差去切割字符串,就可以得出最大的回文字符串。
代码如下
public String longestPalindrome(String s) {
if(s.length() == 1 || s == null) return s;
int len = s.length();
boolean[][] array= new boolean[len][len];
for(int i = 0;i < len;i++){
array[i][i] = true;
}
int maxlen = 1;
int begin = 0;
char[] ch = s.toCharArray();
for(int L = 2;L <=len;L++){
for(int i = 0;i < len;i++){
int r = L + i -1;
if(r >=len) break;
if(ch[i] != ch[r]){
array[i][r] = false;
}else{
if(r - i < 3){
array[i][r] = true;
}else{
array[i][r] = array[i + 1][r - 1];
}
}
if(array[i][r] && (r -i + 1) > maxlen){
maxlen = r - i + 1;
begin = i;
}
}
}
return s.substring(begin, begin + maxlen);
}