题:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
思路:
从左到右 每次循环以当前位置为中心向两边扩散
在这里要注意一点 扩散情况需要判断两种 一种是以 aaaabaccccc为例的奇数长度
一种是 aabbac为例的偶数长度 他们的中心点不同
public String longestPalindrome(String s) {
int length = s.length();
int maxLength = 1;
int maxIndex = 0;
char[] array = s.toCharArray();
for (int i = 0; i < length - 1; i++) {
int chang = jishu(array, i);
if (chang > maxLength) {
maxLength = chang;
maxIndex = i;
}
if (array[i] == array[i + 1]) {
chang = oushu(array, i);
if (chang > maxLength) {
maxLength = chang;
maxIndex = i;
}
}
}
int start = 0;
if (maxLength % 2 == 0) {
start = maxIndex - (maxLength / 2 - 1);
} else {
start = maxIndex - maxLength / 2;
}
return s.substring(start, start + maxLength);
}
public int jishu(char[] array, int zhongxin) {
int left = zhongxin;
int right = zhongxin;
while (true) {
if (array[left] != array[right]) {
return right - left - 1;
}
if (left == 0 || right == array.length - 1) {
break;
}
left--;
right++;
}
return right - left + 1;
}
public int oushu(char[] array, int zhongxin) {
int left = zhongxin;
int right = zhongxin + 1;
while (true) {
if (array[left] != array[right]) {
return right - left - 1;
}
if (left == 0 || right == array.length - 1) {
break;
}
left--;
right++;
}
return right - left + 1;
}