public class LongestPalindromeDemo {
/*
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解决方案
https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-bao-gu/
*/
public String longestPalindrome(String s) {
int n = s.length();
if (n == 0) {
return "^$";
}
// 1、首先我们解决下奇数和偶数的问题,在每个字符间插入 "#",并且为了使得扩展的过程中,到边界后自动结束,在两端分别插入 "^" 和 "$"
String ref = "^";
for (int i = 0; i < s.length(); i++) {
ref += "#" + s.charAt(i);
}
ref += "#$";
// 2、用一个数组 P 保存从中心扩展的最大个数
int len = ref.length();
int[] p = new int[len];
// 中心
int center = 0;
// 半径
int r = 0;
for (int i = 1; i < len - 1; i++) {
int i_mirror = center * 2 - i;
if (r > i) {
// 超出半径
p[i] = Math.min(r - i, p[i_mirror]);
} else {
p[i] = 0;
}
while (ref.charAt(i + 1 + p[i]) == ref.charAt(i - 1 - p[i])) {
p[i]++;
}
// 判断是否需要修改更新R
if (i + p[i] > r) {
center = i;
r = i+ p[i];
}
}
// 最大长度
int maxLen = 0;
// 中心点下标
int centerIndex = 0;
for (int i = 1; i < len - 1; i++) {
if (p[i] > maxLen) {
maxLen = p[i];
centerIndex = i;
}
}
//最开始讲的求原字符串下标
int start = (centerIndex - maxLen) / 2;
return s.substring(start, start + maxLen);
}
public static void main(String[] args) {
String s = new LongestPalindromeDemo().longestPalindrome("ccc");
System.out.println(s);
}
}
力扣学习回文数字
最新推荐文章于 2024-07-10 21:37:49 发布