classSolution {public:intlongestPalindromeSubseq(string s) { vector<vector<int>>memo(s.length(),vector<int>(s.length(),-1));returnfindLPS(s,0,s.length()-1, memo); }private:intfindLPS(string& s,int start,int end,vector<vector<int>>& memo) {if(start > end)return0; // Any character is a palindrome with length 1if(start == end)return1;if(memo[start][end] ==-1) {if(s[start] ==s[end]) {memo[start][end] =2+findLPS(s, start+1, end-1, memo); }else{int l1 =findLPS(s, start+1, end, memo);int l2 =findLPS(s, start, end-1, memo);memo[start][end] =max(l1, l2); } }returnmemo[start][end]; }};
效率還不差: Runtime: 56 ms, faster than 86.91% of C++ online submissions for Longest Palindromic Subsequence. Memory Usage: 69.9 MB, less than 10.00% of C++ online submissions for Longest Palindromic Subsequence.
解法三 - DP
DP 解法的形式其實在上面就已經可以看出來,我們再來看一下詳細說明:
概念上頗為簡單,比較難一點的地方在於初始化,跟之前的比較不同:
另外就是構建 DP table 的順序也有點特別,因為我們最後的答案是在右上角,所以我們會從 start 最大的地方開始構建,然後 end 就從 start+1 開始到最後(如果 end < start,那就不用算):