題目解釋:
子串:小於等於原字串長度由原字串中任意個連續字元組成的子串行
回文:關於中間字元對稱的文法,即「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 演算法 演算法基本要點 首先用乙個非常巧妙的方式,將所有可能的奇數 偶數長度的回文子...