leetcode 5. Longest Palindromic Substring 最长回文串

本文介绍如何使用Manacher算法解决寻找给定字符串中最长回文子串的问题,通过预处理和动态计算,高效地找到满足条件的最长回文串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • Longest Palindromic Substring

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
这道题求最长回文串,利用Manacher算法实现。

    public String longestPalindrome(String s) {
        //预处理,字母之间插入‘#’
        StringBuilder sb=new StringBuilder();
        sb.append("#");
        int n=s.length();
        for(int i=0;i<n;i++ ){
            sb.append(s.charAt(i));
            sb.append("#");
        }
        //rad[i]保存以i位置为中心的最长回文串
        int newN=2*n+1;
        int[] rad=new int[newN];
        int id=-1;   //最长回文串的索引
        int mx=-1;   //最长回文串的边界索引
        int j;       //对称点索引
        for(int i=0;i<newN;i++){
            if(i<=mx){
                j =id*2-i;//i关于id的对称点
                if(mx-i>rad[j])
                    rad[i]=rad[j];
                else
                    rad[i]=mx-i;
            }
            while( i+rad[i]<newN && i-rad[i]>=0 && sb.charAt(i+rad[i])==sb.charAt(i-rad[i]))
                rad[i]++;
            if(i+rad[i]-1>mx){
                mx=i+rad[i]-1;
                id=i;
            }
        }
        //找出最长的长度
        id=0;
        mx=0;
        for(int i=0;i<newN;i++){
            if(rad[i]>mx){
                mx=rad[i];
                id=i;
            }
        }
        //找出字符串
        StringBuilder res=new StringBuilder();
        int i=id-mx+1;
        while(i<id+mx-1){
            if(sb.charAt(i)!='#')
                res.append(sb.charAt(i));
            i++;
        }
        return res.toString();
    }

其他文章:
https://www.felix021.com/blog/read.php?2040

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值