题目描述:
给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
解决方法:
回文串:正着读和倒着读是一样的
比如:“bab”,倒过来也是“bab”
比如:“shdnndhs”,倒过来也是“shdnndhs”
从另一个方向思考就是,从回文字符串的中间向两侧扩散得到的结果是一样的。
但是这个要分字符串是奇数或者偶数的情况:
1.奇数:比如“cabac”
那么中间的字符是b,向两边扩散分别是“a”,“c”。
2.偶数:比如“bbbb”
那么中间的是“bb”,向两边扩散是“b”。
需要对给定的字符串中的每个字符作考虑,考虑以它为中心能够形成的回文串,长度为奇数或者偶数两种不同的情况要分别判断一下,取长度较长的一种情况。
代码如下:
class Solution {
public String longestPalindrome(String s) {
if (s == null || s.length() < 2) {
return s;
}
int left = 0, right = 0;
int maxLength = 1;
int centerIndex = 0;
int flag = 1;// 1奇数,2偶数
for (int i = 0; i < s.length(); i++) {
left = i - 1;
right = i + 1;// 奇数情况
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
int len = right - left - 1;
if (len > maxLength) {
maxLength = len;
centerIndex = i;
flag = 1;
}
left = i;
right = i + 1;// 偶数情况
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
len = right - left - 1;
if (len > maxLength) {
maxLength = len;
centerIndex = i;
flag = 2;
}
}
if (flag == 1) {
return s.substring(centerIndex - maxLength / 2, centerIndex + maxLength / 2 + 1);
} else if (flag == 2) {
return s.substring(centerIndex - maxLength / 2 + 1, centerIndex + maxLength / 2 + 1);
} else {
return "";
}
}
}