leecode 5(求回文字串)

2021-10-03 08:04:37 字數 2116 閱讀 8240

方法一:中心擴充套件法+動態規劃

方法二: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 肯定...