最长回文子串--算法思想探讨和实现(python java)

该博客探讨最长回文子串的算法思想并给出Python和Java实现。首先明确问题,即给定字符串求其最长回文子串,解题思路引用了某播主讲解,随后分别给出了Python和Java的代码实现。

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

最长回文子串–算法思想探讨和实现(python java)

回文串定义:
    如果一个字符串正着读和反着读是一样的,那它就是回文串。

下面是一些回文串的实例:

 12321 
 a
 aba 
 abba
 aaaa 
 tattarrattat

问题定义

最长回文子串问题:给定一个字符串,求它的最长回文子串。

解题思路:

算法的解题思路来源于这位播主的讲解,写的很棒,这里我就直接引用了(在次感谢这位大佬)

代码实现:

python实现

import math
def LongestPalindromeSubstring(str):
    str_padding=["#"]
    for char in str:
        str_padding.append(char)
        str_padding.append("#")

    # print("".join(str_padding))
    pos=0
    maxRight=0
    len_Max=0
    pos_Max=0
    len_str_padding=len(str_padding)
    rl=[0]*len_str_padding
    # print(len(rl))
    for i in range(len_str_padding):
        if i<maxRight:
            j=2*pos-i
            rl[i]=min(rl[j],maxRight-i)
        else:
            rl[i]=1
        while i-rl[i]>=0 and i+rl[i]<len_str_padding and str_padding[i-rl[i]]==str_padding[i+rl[i]]:
            rl[i]+=1
        if i+rl[i]-1>maxRight:
            pos=i
            maxRight=i+rl[i]-1
        if len_Max<rl[i]:
            len_Max=rl[i]
            pos_Max=i

    return "".join(str_padding[pos_Max-len_Max+1:pos_Max+len_Max-1]).replace("#","")


if __name__=='__main__':
    str=input("请输入你要检测的字符串:")
    print(LongestPalindromeSubstring(str))

java实现

package com.xhm.blog;

import java.util.Scanner;

public class LongestPalindromeSubstring {
    public static void main(String[] args) {
        String str1=null;
        Scanner scanner=new Scanner(System.in);
        if(scanner.hasNextLine()){
            str1 = scanner.nextLine();

        }
        System.out.println(LongestPalindromeSubstring.LPS_subString_1(str1));
        scanner.close();

    }

    public static String LPS_subString_1(String str){
//        System.out.println(str);
        int len_str=str.length();
        String[] str_padding=new String[2*len_str+1];
        for(int i=0;i<2*len_str+1;i++){
            if(i%2==0)
                str_padding[i]="#";//填充的符号
            else
                str_padding[i]=String.valueOf(str.charAt((i-1)/2));

        }
//        System.out.println(str_padding.toString());

        int rl[] =new int[2*len_str+1];//注意java里面 int 默认值全是0
        int pos=0,maxRinght=0;
        int pos_Max=0,len_Max=0;
        for(int i=0;i<2*len_str+1;i++){
            int j=2*pos-i;
            if(i<maxRinght){
                rl[i]=Math.min(rl[j],maxRinght-i);//站在j的角度去理解
            }
            else
                rl[i]=1;
            //在上述所能确定的最小的rl上继续扩展
            while (i-rl[i]>=0 && i+rl[i]<2*len_str+1 && (str_padding[i-rl[i]].equals(str_padding[i+rl[i]]))){
                rl[i]++;
            }

            if (i+rl[i]-1>maxRinght){
                maxRinght = i+rl[i]-1;
                pos=i;
            }
            if(rl[i]>len_Max){
                len_Max=rl[i];
                pos_Max=i;
            }

        }

        String res="";
        for(int i=pos_Max-len_Max+1;i<=pos_Max+len_Max-1;i++){
            res+=str_padding[i];
        }
        String res_1=res.replace("#","");
//        System.out.println(res_1);
        return res_1;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值