问题描述:给你一个字符串 s
,找到 s
中最长的回文子串。
示例1:
输入: s = "babad"
输出: "bab"
解释: “aba”同样是符合题意的答案;
示例2:
输入: s = "cbbd"
输出: "bb"
示例3:
输入: s = "a"
输出: "a"
示例4:
输入: s = "ac"
输出: "a"
提示:
1<=s.length<=1000
s仅由数字和英文字母(大写和/或小写)组成
问题分析:在计算机科学中,最长回文子串或最长对称因子问题是在一个字符串中查找一个最长的连续的回文的子串,例如“banana”最长回文子串是“anana”。最长回文子串并不一定是唯一的,比如“abracadabra”,没有超过3的回文子串,但是有两个回文字串长度都是3:“ada”和“aca”。在一些应用中,我们求出全部的极大回文子串(不被其他回文串包含的回文子串)。
对于回文子串问题有很多解法,在这我采用的方法是从回文子串的中心出发,求取最长回文子串。根据回文子串的定义可知,回文子串都是中心对称的,但是回文子串又分为奇回文子串和偶回文子串。
不论是奇偶回文子串,都是从子串的中心出发,向两边扩展,扩展的两边必定是对称的。如果是奇回文子串,中心只有一个元素;如果是偶回文子串,中心是两个元素。
import java.util.Scanner;
import static java.lang.Math.max;
public class huiwen {
public int compute_maxstr(int L,int R,String s){
while(L>=0 && R<s.length() && s.charAt(L)==s.charAt(R)){
L -=1;
R +=1;
}
return R-L-1;
}
public String longestPalindrome(String s) {
int len1=0,len2=0,maxlen=0;
int length = s.length();
int L=0,R=0;
if(s==null || length<1)
return "";
else {
for(int i=0;i<length;i++){
//回文子串为偶数串时
len1 = compute_maxstr(i,i,s);
//回文子串为奇数时
len2 = compute_maxstr(i,i+1,s);
maxlen = max(len1,len2);
if(maxlen >(R-L+1)){
L = i - (maxlen-1)/2;
R = i + maxlen/2;
}
}
}
return s.substring(L,R+1);
}
public static void main(String[] args) {
System.out.println("请输入一串字符串:");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
huiwen h = new huiwen();
String longest = h.longestPalindrome(str);
System.out.println(longest);
}
}