问题描述
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:输入:s = "cbbd"
输出:"bb"来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
Java Burst Force 会超时
class Solution {
public String longestPalindrome(String s) {
String ans = "";
for(int i = 0;i < s.length();i++){
for(int j = i + 1;j <= s.length();j++){
String t = s.substring(i,j);
if(isPalindrome(t)){
if(t.length() > ans.length())
ans = t;
}
}
}
return ans;
}
public boolean isPalindrome(String s){
int left = 0;
int right = s.length() - 1;
if(left < right){
if(s.charAt(left) == s.charAt(right)){
return isPalindrome(s.substring(left + 1,right));
}else {
return false;
}
}
return true;
}
}
Java 中心扩散算法
class Solution {
int[] ans = new int[2];
public String longestPalindrome(String s) {
int len = s.length();
if(len == 0 || len == 1){
return s;
}
char[] ss = s.toCharArray();
for(int i = 1;i < len;i++){
//奇数个字符
fun(ss,len,i,i);
//偶数个字符,以两个字符开始扩散
fun(ss,len,i - 1,i);
}
return s.substring(ans[0],ans[1]);
}
public void fun(char[] ss,int len,int start,int end){
while(start >= 0 && end <= len - 1){
if(ss[start] == ss[end]){
start--;
end++;
}else {
break;
}
}
//重点:不包括end也不包含start,所以start要加1
if(end - (start + 1) > ans[1] - ans[0]){
ans[0] = start + 1;
ans[1] = end;
}
}
}