圖解最長迴文子串「Manacher 算法」,基礎思路感性上的解析

問題描述:

給你一個字符串 s,找到 s 中最長的迴文子串。
連接:https://leetcode-cn.com/problems/longest-palindromic-substring算法

「Manacher 算法」的總體思路是:基於迴文字符串的對稱性,緩存前面字符的「臂長」信息,以便後面複用。

這裏只以手繪小圖片的方式簡單講解「Manacher 算法」緩存

首先設想一個迴文字符串,看下圖

我但是一個迴文字符串喲

這個小人以身體爲軸,左右對稱,能夠看做一個迴文字符串(設想全部字符分佈在其手臂和脖子上)。也就是以脖子爲中心,左右對稱。code

脖子上的字符對應的臂長就是當前手臂的長度。blog

如今小人的左臂上有一個字符 a

思考如何利用迴文串的對稱性,快速得出 a 的最小臂長,也就是當 a 爲脖子時,它的手臂至少是多長。圖片

.......... 思考中🤔 .........leetcode

若是已知右臂上全部字符的臂長,那麼能夠快速找到 a 的對稱點 a'

a' 的臂長跟 a 的臂長之間的關係是什麼?

在此圖中的狀況下,a 的臂長至少至少等於 a' 的臂長。只須要在這個臂長的基礎上計算其臂長是否更大。字符串

計算方法就是不斷讓本身的手臂延長,檢查變成以後左右兩手是否還相等get

若是 a' 的臂長超過了原來的脖子呢

這個狀況下,a 的基礎臂長是 a' 到脖子的距離
string

其它邊界狀況請自行思考

圖片是在 https://sketch.io/sketchpad/ 隨手畫的io

相關文章
相關標籤/搜索