5. Longest Palindromic Substring

本文介绍了如何使用Manacher算法(马拉车算法)来高效地找到字符串中的最大回文子串。该算法避免了朴素方法的O(n^2)时间复杂度,通过利用已知回文串信息来优化搜索过程。详细步骤包括寻找回文串的右边界、中心点,以及判断新点是否能被右边界覆盖。当新点可以被覆盖时,会考虑对称点的回文串半径,以决定是否需要重新计算。在找到新的最右边界后,会更新最长回文串的记录。附带了Java代码实现。
摘要由CSDN通过智能技术生成

最大回文字符串

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Input: "cbbd"
Output: "bb"

思路:最大回文字符串利用manacher算法(马拉车算法)
最开始的思路是遍历字符串,以每一位为中心向两边扩展,寻找最大的回文字符串,并更新最大值,最后返回最长字符串即可。但是此方法的时间复杂度为 O(n2)。因为不能完全利用以前已经知道的信息。

manacher算法:也是遍历字符串,寻找最大的回文长度。但是此算法要充分利用以前已经算出回文长度的位置的信息。
(参考文章:https://mp.weixin.qq.com/s/Zrj35DrnQKtAENiR5llrcw)

  • 寻找回文字符串能够覆盖到的右边界rightSide和此时回文串的中心点rightSideCenter
  • 下一个待查找的点i不能被右边界覆盖,即i > rightSide
    此时只能以此点为中心向两边扩展,寻找最大回文串
  • 下一个待查找的点i可以被右边界覆盖,即i < rightSide
    寻找关于rightSideCenter的左边对称点,查看此位置的回文串半径halfLength
    如果i+halfLength < rightSideCenter,根据对称性,此点的回文串和对应位置的是一样的,就不必再进行计算
    如果i+halfLength > rightSideCenter,那么此点处到2*rightSide-i 到 rightSide这一段还是回文的,但是rightSide之后的还需要再次进行扩展,判断回文串长度是否可以再增加
  • 每次寻找到新的最右边界之后,比较此回文串和之前的大小,得到最大回文串

java代码:

package Code.src.LeetCode;

import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;

import java.util.Scanner;

public class Medium_LongestPalindromicSubstring {
   
    public static void main(String[] args){
   
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        Medium_LongestPalindromicSubstring ml = new Medium_LongestPa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值