首页 > 其他 > 详细

5. 最长回文子串

时间:2020-04-07 16:05:28      阅读:67      评论:0      收藏:0      [点我收藏+]

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

1、中心扩展法
class Solution {
    public String longestPalindrome(String s) {
        //中心扩展法
        int start = 0,end = 0;       
        if(s == null || s.length() == 0) return "";
        for(int i = 0;i < s.length();i++){
            int len1 = expand(s,i,i);
            int len2 = expand(s,i,i + 1);
            int len = Math.max(len1,len2);
            if(len > end - start +1){
                start = i - (len - 1) / 2;
                //len / 2
                end = i + len / 2;
            }
        }
        return s.substring(start,end + 1);
    
    }
  
    private int expand(String s,int i,int j){
        int len = 1;
        int l = i,h = j;
            while(i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)){
                len = (j - i + 1 > len) ? (j - i + 1) : len;
                i--;
                j++;
                 
            }
        return len;
        
    }
}

2、Manacher

class Solution {
    public String longestPalindrome(String s) {
        //Manacher
        String manacherStr = getManacherStr(s);
        char[] charArray = manacherStr.toCharArray();
        int[] pArray = new int[charArray.length];  
        int pR = -1;
        int index = -1;
        
        int max = 0;
        int start = 0;
        for(int i = 0;i < charArray.length;i++){
            //首先判断是否在最远边缘内部
            //pArray[2 * idnex - i]处的半径
            pArray[i] = i < pR ? Math.min(pR - i,pArray[2 * index - i]) : 1;
            while(i + pArray[i] < charArray.length && i - pArray[i] >= 0){
                if(charArray[i + pArray[i]] == charArray[i - pArray[i]]){
                    pArray[i]++;
                }else{
                    break;
                }
            }
            //更新最右边缘与其index
            if(i + pArray[i] > pR){
                pR = i + pArray[i];
                index = i;
            }
            //更新起始位置
            if(pArray[i] > max){
                  max = pArray[i];
                  start = (i - max + 1) / 2;
            }
        }
        //max为真实长度 - 1
        return s.substring(start,start + max - 1); 
    }

    private String getManacherStr(String s){
        String res = "#";
        for(int i = 0;i < s.length();i++){
            res += s.charAt(i) + "#";
        }
        return res;
    } 
}

 

 

5. 最长回文子串

原文:https://www.cnblogs.com/zzytxl/p/12653836.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!