manacher演算法(最長回文串)

2021-10-02 07:36:58 字數 1036 閱讀 5872

題目解釋:

子串:小於等於原字串長度由原字串中任意個連續字元組成的子串行

回文:關於中間字元對稱的文法,即「aba」(單核)、「cabbac」(雙核)等

最長回文子串:1.尋找回文子串;2.該子串是回文子串中長度最長的。

首先要知道這個演算法是用來在o(n)的時間裡看乙個字串的最長回文子串的長度是什麼。其次,它的核心原理還是動態規劃。

既然是動態規劃,那麼一定要找子狀態!這一點很重要。幾乎所有的動態規劃,你明白子狀態是什麼,子狀態是如何組成下乙個狀態的,就等於搞清楚這個演算法。

那麼我們先來這樣看,假如我們知道乙個陣列p,p[n]代表的是從n這個位置為中心的子串,它的右邊一半的長度,換句話說:2*p[n]是以n處為中心的回文子串的長度。

這裡注意這個p[n]包括了一開始加進去的 #,所以實際上去掉 # 後的回文串長度就是p[n],不需要乘2了。

那麼根據動態規劃的定義,要求這麼乙個陣列,就是如下的方法,

如果要求p[i],那麼我們一定已經知道了小於i的所有值(也就是說如果j按照之前的假設,p[j] p[c] m 這三個值都已知了,都是在計算小於i的所有情況時儲存的。

下面就是核心邏輯:

/*

* @author: firefly

* @date: 2020-01-20 13:30:09

* @descripttion:

* @lastedittime : 2020-01-20 13:34:43

*/#include

#include

using namespace std;

const

int maxn =

100000

;string s;

vector<

char

> str;

int p[maxn]

, ans;

void

manacher()

}}intmain()

cout << ans;

return0;

}

Manacher最長回文串演算法

在介紹演算法之前,首先介紹一下什麼是回文串,所謂回文串,簡單來說就是正著讀和反著讀都是一樣的字串,比如abba,noon等等,乙個字串的最長回文子串即為這個字串的子串中,是回文串的最長的那個。一.通常解決的問題 給定乙個字串,求出其最長回文子串。例如 1 s abcd 最長回文長度為 1 2 s a...

Manacher演算法 最長回文串

若字串長度為n,則演算法的時間複雜度為o n 假設有乙個字串abaaba 先把該字串變成 a b a a b a 第乙個字元設為 防止計算的時候陣列越界 再計算p陣列,先給出p陣列的答案 i為座標,ma陣列放改變後的字串,p陣列代表以該字元為中心,向右和向左延伸p i 個,是回文串 i 0 1 2 ...

最長回文字串(manacher演算法)

資料 網路 參見 問題描述 輸入乙個字串,求出其中最大的回文子串。子串的含義是 在原串中連續出現的字串片段。回文的含義是 正著看和倒著看相同,如abba和yyxyy。解析 這裡介紹o n 回文子串 manacher 演算法 演算法基本要點 首先用乙個非常巧妙的方式,將所有可能的奇數 偶數長度的回文子...