1. 程式人生 > >Leetcode 516. Longest Palindromic Subsequence

Leetcode 516. Longest Palindromic Subsequence

ems 字符 解題思路 desc pos stp i+1 class 長度

問題鏈接

Leetcode 516

題目解析

求最長回文子序列。

解題思路

子序列和子串有區別的,子序列不需要連續,相對位置遞增即可。

動態規劃。對於任意字符串,如果頭尾字符相同,那麽字符串的最長回文子序列等於去掉首尾的字符串的最長回文子序列加上首尾;如果首尾字符不同,則最長子序列等於去掉頭的字符串的最長子序列和去掉尾的字符串的最長子序列的較大者。

因此動態規劃的狀態轉移方程為:

設字符串為str,長度為n,dp[i][j]表示第i到第j個字符間的回文子序列的最大長度(i<=j),則:

狀態初始條件:dp[i][i]=1 (i=0:n-1)

狀態轉移方程:

  dp[i][j]=dp[i+1][j-1] + 2  if(str[i]==str[j])

  dp[i][j]=max(dp[i+1][j],dp[i][j-1])  if (str[i]!=str[j])

你可能已經發現,這和LCS的狀態轉移幾乎沒什麽兩樣,沒錯,最長回文子序列LPS其實就是最長公共子序列LCS,為什麽呢?你想一下,如果把字符串反轉,看作第二個字符串,那我要求的,不就是這兩個字符串的LCS嗎?對不對,對不對!

參考代碼

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        vector<vector<int>> dp(s.length(),vector<int>(s.length()));
        for(int i=s.length()-1
;i>=0;i--) { dp[i][i]=1; for(int j=i+1;j<s.length();j++) { if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1]+2; else dp[i][j]=max(dp[i+1][j],dp[i][j-1]); } } return
dp[0][s.length()-1]; } };

本文版權歸作者AlvinZH和博客園所有,歡迎轉載和商用,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利.

Leetcode 516. Longest Palindromic Subsequence