美文网首页
w1-T03 之5.最长回文子串-中等

w1-T03 之5.最长回文子串-中等

作者: 小院闲窗春已深 | 来源:发表于2020-05-03 20:36 被阅读0次

    题目

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

    示例 1:

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

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

    来源:力扣(LeetCode)

    解法1:马拉车算法
    加工字符串
    利用中心位C拓展找到基线P[i]
    在基线上继续中心扩张回文子串长度P[i]
    修改中心位置C,改变边界R

    class Solution {
        public String preProcess(String s){
                int n = s.length();
                if(n==0){
                    return "^$";
                }
                String ret="^";
                for(int i =0 ; i<n;i++){
                    ret+="#"+s.charAt(i);
                }
                return ret += "#$";
            }
        public String longestPalindrome(String s) {
            String T =preProcess(s);
            int n =T.length();
            int[] P=new int[n];
            int C=0,R=0;
            //从1个开始,到n-1个结束,是为了防止越界
            for(int i =1 ; i<n-1;i++){
                //寻找P[i]的基线
                int i_mirror=2*C-i;
                if(R>i){
                    //在边界里面
                    P[i]=Math.min(P[i_mirror], R-i);
                }else{
                    P[i]=0;
                }
                //基线+不断摸索扩展=真实P[i]
                while(T.charAt(i+1+P[i])==T.charAt(i-1-P[i])){
                    P[i]++;
                }
                //如果真实P[i]越过了边界的话
                if(i+P[i]>R){
                    C=i;//更改中心位置
                    R=i+P[i];//更改边界位置
                }
            }
            //寻找P[x]最大值
            int len=0;
            int index=0;
            for(int i =1;i<n-1;i++){
                if(P[i]>len){
                    len=P[i];
                    index=i;
                }
            }
            int start=(index-len)/2;//寻找最初位置
            return s.substring(start,start+len);
            
        }
    }
    
    image.png

    相关文章

      网友评论

          本文标题:w1-T03 之5.最长回文子串-中等

          本文链接:https://www.haomeiwen.com/subject/fspjghtx.html