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);
}
posted @ 2025-03-12 12:34  乘除法  阅读(35)  评论(0)    收藏  举报