暴力解最長回文問題(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...