方法一:中心擴充套件法+動態規劃
方法二:manacher 演算法
法一:
#include
#include
#include
#include
typedef
struct node_node;
//中心擴充套件法+動態規劃
node*
getreturnsize
(char
*s,int center_pre,
int center_next)
while
(s[center_pre]
==s[center_next])}
node-
>pos=
&s[center_pre]
;return node;
}char
*longestpalindrome
(char
* s)
else
if(maxsize
//當長度達到新長度時改變位置
free
(node1)
;free
(node2);}
char
* back_s=
(char*)
calloc
(maxsize,
sizeof
(char))
;for
(int i=
0;i)return back_s;
}int
main()
法一比較簡單的寫法:(過leecode)
//思路:在字串前後加上『$』,在字串兩個字元之間加上『#』,當選的元素進行動態規劃
//時,#與正常元素時結果字串的長度有影響,但是對於在找回文字串開頭元素位置時
//又沒有分別,要將指標移動result_size-1下
intgetreturnsize
(char
*ss,
char
*left,
char
*right)if(
*start==
'#')
//根據關鍵元素不同,統計字串長度
cur_size=
2*cur_size;
elseif(
*start!=
'#'&&
*start!=
'$') cur_size=
2*cur_size-1;
return cur_size;
}char
*longestpalindrome
(char
* s)
ss[2*size-1]
=s[size-1]
; ss[
2*size]
='$'
;//將字串元素轉換成「$元素#元素#元素#...#元素$」
LeeCode 5 最長回文字串(自己的演算法)
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 思路 我的第一想法是要遍歷給定字串,不要從第乙個字元開始遍歷,從第二個字元開始,這個寫程式的時候方便一...
leecode 5 最長回文子串 遞迴解法
動態規劃,本質上就是 帶備忘錄的遞迴的計算過程。遞迴過程為 自頂向下的問題拆解和自底向上的問題計算。迭代形式的動態規劃,略過問題拆解,直接計算,能節省一定的時空。本題中,因遞迴法的時空效率太差 擊敗5 需進一步優化 改為迭代形式 分析過程 遞迴過程 暴力遞迴窮舉 備忘錄優化 構造遞迴遍歷 二叉樹遍歷...
LeeCode筆記 5 最長回文子串
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 使用動態規劃,dp i j 是從j到i的子串是否是回文串 值為true或false dp i i 肯定...