Manacher演算法及其擴充套件

2021-10-14 08:04:46 字數 2346 閱讀 1266

暴力解最長回文問題(o(n

2)o(n^2)

o(n2))

manacher演算法o(n)

回文字串:

正著看反著看是一樣的

abccba abcba 存在乙個軸對稱

最長回文字串問題

在乙個字串中找到最長回文字串,而manacher演算法就是去找這個最長回文字串。

有啥用?

dna序列 回文基因序列有一些生理學意義

暴力解最長回文問題(o(n

2)o(n^2)

o(n2

))

ab|ab 按照虛軸對稱

ababa 按照實軸中間的a對稱

遍歷每個實軸與虛軸,分別向兩邊擴充套件,存最長的

public

static string getmaxstr

(string s)

m-=1;

n+=1;

}//以該字母後面為虛軸

m=i;

n=i+1;

while

(m>=

0&&n

length()

&&s.

charat

(m)==s.

charat

(n))

m-=1;

n+=1;

}}return maxstr;

}

其儲存一定資訊,加速上述思路的擴充套件過程,訪問必要資訊,達到線性時間(與kmp類似哈)

加速tips的理解:

儲存的資訊

回文半徑陣列(以每一位為中心的回文字串長度)

r(最遠的右邊界)

c(最遠的右邊界的中心點)

幾種情況

i在r外的時候 沒有任何優化

i在r內的時候 若鏡面無法完全包含,我們直接跳到鏡面外的字母開始更新就行

i在r內的時候 若鏡面完全包含,我們沒必要拓展這個字母

**

//tested

//abcd->#a#b#c#d#

public

static

char

tostrx

(string str)

else

}return strx;

}//tested

//檢測i是否在陣列x(長度為l)越界

public

static

boolean

isvalid

(int i,

int l)

//tested

//返回該節點的最大回文字串長度

public

static

intexpand

(char

strx,

int i,

int j)

//以i節點為中心,從j節點開始擴充套件

j-=1;

return2*

(j-i)+1

;}//tested

//得到最大回文字串(去掉#)

public

static string str

(char

t,int[

] parax)

} string str=

tostr

(t, maxi-

(max-1)

/2, maxi+

(max-1)

/2);

return str;

}//manacher演算法

public

static string manacher

(string str)

else

}else}

string string=

str(strx,parax)

;return string;

}//tested

//給定#a#b#c#d# 第幾位到第幾位 擷取並刪除#

public

static string tostr

(char

strx,

int a,

int b)

}return str;

}

詳解manacher演算法,及其擴充套件

懂了演算法,改改 即可ac京東18年校園招聘這題。京和東東是好朋友。東東很喜歡回文。回文是指從前往後讀 和從後往前讀是一樣的詞語。京京準備給東東乙個驚喜,先取定 乙個字串s,然後在後面附上0個或者更多個字母形成回文,京 京希望這個回文越短越好。請幫助京京計算他能夠得到的最短 的回文長度。輸入描述 輸...

演算法題 Manacher演算法及其擴充套件

2017 11 21 manacher問題 找出字串str中最長的回文子串 1 在解決最長回文子串問題前,要解決奇回文和偶回文的問題。我們在判斷奇回文時,是根據乙個字串,然後同時向兩邊擴充套件 偶回文則是直接向兩邊擴充套件,中間沒有字串。如下 12a21 奇回文 1221 偶回文 為了解決這個問題,...

manacher演算法及擴充套件

最近學習了一些演算法,總結一下 manacher演算法和擴充套件。manacher演算法是求乙個字串中,最大回文子串的長度。ifndef manacher h define manacher h manacher演算法 找出字串str中最長的回文子串 define min a,b ab?a b in...