算法笔记: 最长回文子串

DP

目录

这是读书时一篇旧文搬运.几年后再次回顾下算法.

描述

给定一个串,求它的最长回文子串。

DP思路

DP的关键是梳理出问题与子问题的关系。

F[i,j]表示i..j的最长回文串的长度,那么跟其子问题的关系如下:

  F[i,j] = max { F[i+1, j-1] + 2 ----- if str[i] == str[j] && F[i+1, j-1] == j-1-(i+1)+1 ////如果i+1..j-1非回文但又有str[i] == str[j]怎么办?
                 F[i+1,j]        ----- otherwise1
                 F[i,j-1]        ----- otherwise2
                }

如果问题是判断某个串是否为回文子串,那么问题与子问题的关系则变为:

  isP[i,j] = {
                isP[i+1,j-1] ----- if str[i] == str[j]
                false        ----- otherwise
             }

具体编码

这个就不贴代码了.

Manacher算法

主要是利用到了回文串的特点(中心对称),解题路径上可以优化掉一些分支. 已求解的部分子问题,如果是某个回文串的一半,那么其另一半可以直接得到答案。

由于我们的目标不是优化到百分之百,这个算法具体我就不深究了反正以前也实现过。

Reference

更详细的可以check以前的旧文.