前往
大廳
主題

LeetCode - 516. Longest Palindromic Subsequence 解題心得

Not In My Back Yard | 2022-07-13 12:00:05 | 巴幣 0 | 人氣 223

題目連結:


題目意譯:
給定一字串 s,找到 s 中最大的迴文子序列之長度。

一子序列為一序列其可藉由在另一序列中刪除若干個元素並且不更動剩餘元素之順序下得到。

限制:
1 ≦ s.length ≦ 1000
s 只由小寫英文字母組成。



範例測資:
範例 1:
輸入: s = "bbbab"
輸出: 4
解釋: 其中一個可能的最長迴文子序列為 "bbbb"。

範例 2:
輸入: s = "cbbd"
輸出: 2
解釋: 其中一個可能的最長迴文子序列為 "bb"。


解題思維:
很單純的動態規劃(Dynamic Programming)題型。

定義一個二維陣列 D,其中 D[L][R] 代表著 [L, R] 這個範圍中最長的迴文子序列之長度。可以看到其邊界條件為
當 L = R 時,D[L][R] = 1;
當 L > R 時,D[L][R] = 0。
而遞迴式為如下
當 s[L] = s[R] 時,D[L][R] = D[L + 1][R - 1] + 2;
當 s[L] ≠ s[R] 時,D[L][R] = max(D[L + 1][R], D[L][R - 1])。

接著我們從 D[0][s.length - 1] 遞迴下去(也就是 top-down 的精神,如這題所述)便可以求得所求(只是要記得不要重複去算已經算過的子問題)。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作