版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuzhixiong_521/article/details/87158837
题目链接
Problem.5:https://leetcode.com/problems/longest-palindromic-substring/
题目描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例
输入1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
输入2:
输入: "cbbd"
输出: "bb"
解析
首先将字符串转为char[]数组,并在数组的两端及元素中间插入“#”,形成一个新数组。例如字符串“babad”插入“#”之后,新数组为[‘#’,‘b’,‘#’,‘a’,‘#’,‘b’,‘#’,‘a’,‘#’,‘d’,‘#’]。然后遍历新数组,并以当前元素为中心向两边扩展(注意不能越界),直到不满足对称的条件为止,同时记录最大长度以及下标索引,最后根据下标索引以及最大长度获得最长回文子串,并将‘#’替换为空。
代码
public String longestPalindrome(String s) {
char[] chars = new char[2 * s.length() + 1];
for (int i = 0; i < s.length(); i++) {
chars[2 * i] = '#';
chars[2 * i + 1] = s.charAt(i);
}
chars[chars.length - 1] = '#';
int max = 0;
int idx = 0;
for (int i = 0; i < chars.length; i++) {
int k = 0;
while (i - k >= 0 && i + k < chars.length && chars[i - k] == chars[i + k]) {
k++;
}
if (k > max) {
max = k;
idx = i;
}
}
String res = String.valueOf(chars).substring(idx - max + 1, idx + max);
return res.replaceAll("#", "");
}