[LeetCode]Longest Palindromic Subsequence

栏目: 编程工具 · 发布时间: 9年前

内容简介:[LeetCode]Longest Palindromic Subsequence

题目描述:

LeetCode 516. Longest Palindromic Subsequence

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".

题目大意:

求最长回文子序列的长度

解题思路:

解法I 动态规划(Dynamic Programming)

状态转移方程:

dp[i][j] = max(dp[i][j], dp[i + 1][j - 1] + 2) if s[i] == s[j]
dp[i][j] = max(dp[i][j - 1], dp[i + 1][j])  otherwise

上式中,dp[i][j]表示s[i .. j]的最大回文子串长度

Java代码:

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

解法II 动态规划(Dynamic Programming)

问题转化为求s与reversed(s)的最长公共子序列

令s' = reversed(s), size = len(s)

dp[i][j]表示s[0 .. i]与s'[0 .. j]的最长公共子序列的长度

枚举回文串的中点m,求dp[m][size - m] * 2 以及 dp[m - 1][size - m] * 2 + 1的最大值

Java代码:

public class Solution {
    public int longestPalindromeSubseq(String s) {
        int size = s.length();
        int[][] dp = new int[size + 1][size + 1];
        for (int i = 1; i <= size; i++) {
            for (int j = 1; j <= size; j++) {
                if (s.charAt(i - 1) == s.charAt(size - j)) {
                    dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 1] + 1);
                } else {
                    dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]);
                }
            }
        }
        int ans = s.length() > 0 ? 1 : 0;
        for (int m = 0; m < size; m++) {
            ans = Math.max(dp[m][size - m] * 2, ans);
            if (m > 0) ans = Math.max(dp[m - 1][size - m] * 2 + 1, ans);
        }
        return ans;
    }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Music Recommendation and Discovery

Music Recommendation and Discovery

Òscar Celma / Springer / 2010-9-7 / USD 49.95

With so much more music available these days, traditional ways of finding music have diminished. Today radio shows are often programmed by large corporations that create playlists drawn from a limited......一起来看看 《Music Recommendation and Discovery》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具