题目
给你一个字符串
s
,找到s
中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
方法一:中间扩散
public class LongestPalindrome {
public int maxLen = 0;
public int begin = 0;
public static void main(String[] args) {
String s = "adam";
System.out.println(new LongestPalindrome().longestPalindrome(s));
}
public String longestPalindrome(String s) {
char[] chars = s.toCharArray();
int lens = chars.length;
if (lens<2) {
return s;
}
deal(chars, lens/2, 0);
return s.substring(begin, begin+maxLen);
}
private void deal(char[] chars, int k, int flag) {
int leng = chars.length;
int l = k-1;
int r = k+1;
//解决奇偶
while (l>=0 && chars[l]==chars[k]) {
l--;
}
while (r<leng && chars[r]==chars[k]) {
r++;
}
//中心扩展
int ll = l;
int rr = r;
while (ll>=0 && rr<leng && chars[ll] == chars[rr]) {
ll--;
rr++;
}
if (rr-ll-1>maxLen) {
maxLen = rr-ll-1;
begin = ll+1;
}
if (flag>=0 && (leng-r-1)*2>maxLen) {
deal(chars, r, 1);
}
if (flag<=0 && (l+1)*2>maxLen) {
deal(chars, l,-1);
}
}
}
LeetCode测试结果