5.最长回文子串
给你一个字符串 s,找到 s 中最长的 回文子串。
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。解释:"aba" 同样是符合题意的答案。
方法一:暴力枚举法
- 双循环遍历所有子串 看是否是回文子串
- 是回文:看长度是否超过最大长度
-- 超过:更新回文串并更新长度
-- 没超过:不操作 - 不是回文:不操作
//暴力枚举
public static String longestPalindrome(String s){
String palindrome="";
int maxLen=0;
for (int i = 0; i < s.length(); i++) {
for (int j = i+1; j <= s.length(); j++) {
String subString=s.substring(i,j);
if(IsPalindrome(subString)){//是回文子串
if(subString.length()>maxLen){
palindrome=subString;
maxLen=subString.length();
}
}
}
}
return palindrome;
}
//判断是否为回文字符串
public static boolean IsPalindrome(String s){
char[] chars=s.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (chars[i]!=chars[chars.length-i-1]){
return false;
}
}
return true;
}
方法二:中心扩展法
- 遍历字符串中的每一个位置 向左右两边扩展
-- 奇数:以当前位置为中心
-- 偶数:以当前位置及其下一个位置为中心 - 返回该位置的扩展长度 大于当前最大长度 更新起始点和结束点
//中心扩展并返回回文子串的长度
public static int expandAroundCenter(String s,int left,int right){
while (left>=0&&right<s.length()&&s.charAt(left)==s.charAt(right)){
left--;
right++;
}
return right-left-1;
}
//中心扩展
public static String longestPalindrome(String s){
int start=0,end=0;//初始化回文串起始位置
for (int i = 0; i < s.length(); i++) {
int len1=expandAroundCenter(s,i,i);//奇数回文串
int len2=expandAroundCenter(s,i,i+1);//偶数回文串
int maxLen=Math.max(len2,len1);
if(maxLen>end-start){
start=i-(maxLen-1)/2;
end=i+maxLen/2;
}
}
return s.substring(start,end+1);
}

浙公网安备 33010602011771号