题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
示例1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例2:
输入:s = “cbbd”
输出:“bb”
示例3:
输入:s = “a”
输出:“a”
示例4:
输入:s = “ac”
输出:“a”
解答
方法一:
package com.antg;
import java.util.HashMap;
import java.util.Map;
/**
* @Description: 5. 最长回文子串
* @Author 子兔Antg
* @Date 2021/11/15
**/
public class Code_5 {
public static void main(String[] args) {
String s = "aacabdkacaa";
System.out.println(longestPalindrome(s));
}
public static String longestPalindrome(String s) {
if(s.length()==1){
return s;
}
if(s.length()==2){
if(s.charAt(0)==s.charAt(1)){
return s;
}else{
return Character.toString(s.charAt(0));
}
}
//从第二个字母开始遍历到倒数第二个字符
int counter = 0;//记录位移的长度
int indexLeft = 0;//记录最大回文子串的中心下标
int indexRight = 0;//记录最大回文子串的中心上标
int len = 0;//子串长度
for(int i = 1;i<s.length()-1;i++){
//寻找对称中心
int left = i;
int right = i;
for(int l = 1;i-l>=0;l++){
if(s.charAt(i)==s.charAt(i-l)){
left--;
}else {
break;
}
}
for(int r = 1;i+r<s.length();r++){
if(s.charAt(i)==s.charAt(i+r)){
right++;
}else {
break;
}
}
//按照中心向左右同时刺探并记录个数
int temp = 0;
for(int j = 1;left-j>=0&right+j<s.length();j++){
//向左右刺探
if(s.charAt(left-j)==s.charAt(right+j)){
temp++;
}else {
break;
}
}
//获取本次循环回文的长度
int now = right-left+1+temp*2;
if(now>len){
indexLeft = left;
indexRight = right;
counter = temp;
len = now;
}
}
return s.substring(indexLeft-counter,indexRight+counter+1);
}
}