马拉车算法 LeetCode-5.最长回文子串、LeetCode-214.最短回文串

本文详细介绍了马拉车算法在解决LeetCode-5.最长回文子串和LeetCode-214.最短回文串问题上的应用。通过O(n)时间复杂度的马拉车算法,不仅可以找到最长回文子串,还能解决最短回文串的问题。同时对比了O(n^2)时间复杂度的动态规划方法。
摘要由CSDN通过智能技术生成
马拉车算法

马拉车算法是一种寻找给定字符串中的最长回文子串的方法,时间复杂度为 O(n) 。它除了可以解决“最长回文子串”的问题,还能解决由此变形的一些衍生问题,如“最短回文串”

这里是马拉车算法的详述:
一文让你彻底明白马拉车算法

LeetCode-5.最长回文子串

这里是题目描述:LeetCode-5.最长回文子串

O(n)时间复杂度马拉车算法:

马拉车算法解决的就是这个问题,因此不再做详述
马拉车算法题解代码:

class Solution {
   
    //马拉车算法
    public String longestPalindrome(String s) {
   
        String T=preProcess(s);
        int[] P=new int[T.length()];
        int c=0,r=0;
        for(int i=1;i<T.length()-1;i++)
        {
   
            int i_mirror=2*c-i;
            if(r>i)
            {
   
                P[i]=Math.min(r-i,P[i_mirror]); //防止超出r
            }
            else
            {
   
                P[i]=0; //r==i的情况
            }

            //碰到之前讲的三中情况,需要使用中心扩展法
            while(T.charAt(i+1+P[i])==T.charAt(i-1-P[i]))
            {
   
                P[i]++;
            }

            //判断是否需要更新r
            if(i+P[i]>r)
            {
   
                c=i;
                r=i+P[i];
            }
        }
        //找出P的最大值
        int maxLen=0;
        int centerIndex=0;
        for(int i=0;i<P.length;i++)
        {
   
            if(maxLen<P[i])
            {
   
                maxLen=P[i];
                centerIndex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值