Longest Palindromic Subsequence

来源:互联网 发布:javascript 模块化 编辑:程序博客网 时间:2024/05/21 17:31

题目:

Given a string s, find the longest palindromic subsequence's length in s. You may assume that the maximum length of s is 1000.

Example 1:
Input:

"bbbab"
Output:
4
One possible longest palindromic subsequence is "bbbb".

Example 2:
Input:

"cbbd"
Output:
2
One possible longest palindromic subsequence is "bb".

题目意思:

给定一个字符串s,返回该字符串的最长回文子序列。s的最大长度不超过1000.


解题思路:

     使用动态规划解决,先把它划分成子问题,通过分析,子问题应该是:任意一个该字符串的子串包含的回文串的长度,那么对于这个字符串的子串,我们可以用它在原字符串中的起始位置和结束位置来表示。因此,可以用一个二维数组来对子问题进行表示。longest数组记录字符串[i,j]范围的最长回文序列。

动态转移方程为longest[l][r] = longest[l+1][r-1] + 2 if s[l] == s[r] else longest[l][r] = max(longest[l+1][r], longest[l][r-1]).

算法复杂度:时间复杂度为O(n^2),空间复杂度为O(n^2)


代码如下:

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        if (s.empty())
            return 0;
        vector<vector<int>> longest(s.size(), vector<int>(s.size()));
        for (int len = 1; len <= s.size(); ++len)
            for (int l = 0; l + len <= s.size(); ++l) {
                int r = l + len - 1;
                if (l == r)
                    longest[l][r] = 1;
                else if (s[l] == s[r])
                    longest[l][r] = longest[l+1][r-1] + 2;
                else
                    longest[l][r] = max(longest[l+1][r], longest[l][r-1]);
            }
        return longest[0][s.size() - 1];
    }
};


0 0
原创粉丝点击