题目描述:给你一个字符串 s,找到 s 中最长的回文子串。
示例:
思路:
回文串就是顺着读和倒着读一样的字符串,例如"CBADDDABC"。从第一个元素开始,首先要找到回文串的中间位置,分别用Low保存第一个D的位置,High保存第最后一个D的位置。然后从low和high分别向两端扩散,判断low++与high++对应的元素是否相等,直到串的两端或者low++与high++对应的元素不相等。中间用range数组保存high与low间隔最大的下标,即最长回文串的首尾下标。
代码实现:
class Solution {
public String longestPalindrome(String s) {
if(s == null || s.length() == 0){
return "";
}
int[] range = new int[2];
char[] str = s.toCharArray();
for(int i = 0;i < str.length;i++){
i = lon(i, str, range);
}
return s.substring(range[0], range[1] + 1);
}
//lon数组寻找回文串中间部分最右边的元素下标。由于数组作为参数,传进的是数组的引用,会对原数组
//有影响,所以在寻找high的过程中,range数组分别保存了寻找到的回文串的首位间隔最大的下标,即
//max{high - low}
public static int lon(int low,char[] str, int[] range){
int high = low;
//以"ABCDDDCBA"为例,寻找最右边的D
while(high < str.length-1 && str[low] == str[high]) high++;
int ans = high;
//从两边扩散
while(low > 0 && high < str.length - 1 && str[low - 1] == str[high + 1]){
low--;
high++;
}
if(range[1] - range[0] < high - low){
range[0] = low;
range[1] = high;
}
return ans;
}
}