给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
解析:
- 如果输入
cbababd
,结果是babab
- 遍历数据 -> 假设此时是数据
[start]
- 如果前一位
[start - 1]
和后一位[start + 1]
相等 - 则继续向两边扩散
[start - 2,start + 2]
,直到两边不相等 - 记录此时的索引就是回文子串
- 遍历数据 -> 假设此时是数据
- 如果输入
cbaabd
,结果是baab
- 遍历数据 -> 假设此时是数据
[start]
- 如果
[start]
下一位[start +1]
的值等于数据[start]
- 则记录下一位的位置
[led = start + 1]
- 如果数据
[start]
前一位[start - 1]
和数据[led]
后一位[led + 1]
相等 - 则继续向两边扩散
[start - 2,led + 2]
,直到两边不相等 - 记录索引就是回文子串
- 遍历数据 -> 假设此时是数据
public static String longestPalindrome(String s) {
if (s == null || s.length() == 0) {
return "";
}
// 保存起始位置,测试了用数组似乎能比全局变量稍快一点
int[] range = new int[2];
char[] str = s.toCharArray();
for (int i = 0; i < s.length(); i++) {
// 把回文看成中间的部分全是同一字符,左右部分相对称
// 找到下一个与当前字符不同的字符
i = findLongest(str, i, range);
}
//substring:截取要加1,因为方法不会包含右边的数据
return s.substring(range[0], range[1] + 1);
}
public static int findLongest(char[] str, int low, int[] range) {
// 查找中间部分
int high = low;
//如果当前位置和下一个位置相同,则将记录位置+1 之后将从这两个索引位置左右扩散
while (high < str.length - 1 && str[high + 1] == str[low]) {
high++;
}
// 定位中间部分的最后一个字符 -> 下一次要从这个位置开始继续向后查询
int ans = high;
// 从中间向左右扩散 -> 如果左右相等,就继续扩散,直到不相等,记录索引
while (low > 0 && high < str.length - 1 && str[low - 1] == str[high + 1]) {
low--;
high++;
}
// 记录最大长度
if (high - low > range[1] - range[0]) {
range[0] = low;
range[1] = high;
}
//返回已经查询到的位置,下一次需要从这个索引位置向后查询
return ans;
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。