题目地址:
题目描述:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
解题思路:
1.判断字符串s的长度,小于等于1时,字符串是回文串,返回字符串本身。
2.创建用于存储最长回文子串起始位置的变量mhead,mend。记录最长回文子串长度的lmax。临时存储回文子串起始位置的变量head,end,和回文子串长度len。
3.从头开始遍历字符串,然后将回文子串分成两种不同的情况。
4.回文子串的长度是奇数
5. 回文子串的长度是偶数
代码:
class Solution {
public String longestPalindrome(String s) {
if(s.length() <= 1) return s;
int head = 0, end = 0;
int max = 0, len = 0;
int mhead = 0, mend = 0;
for(int i = 0; i < s.length(); i++){
head = end = i;
len = 0;
while(head > 0 && end < s.length() - 1){
head--;
end++;
if(s.charAt(head) == s.charAt(end)){
len++;
if(len >= max){
//当回文子串长度是奇数时,实际长度是2 * len + 1,而偶数时实际长度是2 * len(max)
//所以在奇数情况下,len等于max时就更新最长回文子串的起始位置
mhead = head;
mend = end;
max = len;
}
}else{
break;
}
}
head = i + 1;
end = i;
len = 0;
while(head > 0 && end < s.length() - 1){
head--;
end++;
if(s.charAt(head) == s.charAt(end)){
len++;
if(len > max){
mhead = head;
mend = end;
max = len;
}
}else{
break;
}
}
}
return s.substring(mhead,mend + 1);
}
}