给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
思路:从头至尾遍历字符串,将每个字符或其与下一个字符中间位置设置为回文子串的中轴,进行分类讨论,然后向两侧拓展,直到遭遇不同的字符为止。保存回文子串长度,与已有最大长度进行比较,若出现了更长的回文子串,则更新最大值,同时保留中轴位置。最后根据保存的最大长度和中轴位置建立新字符串进行填充。
代码:
class Solution {
public String longestPalindrome(String s) {
int ans = 1;
int f = 0;
for(int i = 0;i < s.length();i++)
{
int k = 0;
for(int j = 1;i - j >= 0 && i + j < s.length();j++)
{
if(s.charAt(i - j) == s.charAt(i + j))
{
k += 2;
}
else break;
}
k++;
if(k > ans)
{
ans = k;
f = i;
}
k = 0;
for(int j = 0;i - j >= 0 && i + j + 1 < s.length();j++)
{
if(s.charAt(i - j) == s.charAt(i + j + 1))
{
k += 2;
}
else break;
}
if(k > ans)
{
ans = k;
f = i + 1;
}
}
String str = "";
StringBuffer sb = new StringBuffer(str);
for(int i = 0;i < ans;i++)
{
sb.insert(i,s.charAt(f - ans / 2 + i));
}
return sb.toString();
}
}