码迷,mamicode.com
首页 > 编程语言 > 详细

leetcode 16. 最长回文子序列 java

时间:2019-11-20 21:17:28      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:http   solution   遍历   math   状态   字符   su-   char   long   

题目:

给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。

示例 1:
输入:

"bbbab"
输出:

4
一个可能的最长回文子序列为 "bbbb"。

示例 2:
输入:

"cbbd"
输出:

2
一个可能的最长回文子序列为 "bb"。

解题:

思路:

    • 状态
      f[i][j] 表示 s 的第 i 个字符到第 j 个字符组成的子串中,最长的回文序列长度是多少。

    • 转移方程
      如果 s 的第 i 个字符和第 j 个字符相同的话

      f[i][j] = f[i + 1][j - 1] + 2

      如果 s 的第 i 个字符和第 j 个字符不同的话

      f[i][j] = max(f[i + 1][j], f[i][j - 1])

      然后注意遍历顺序,i 从最后一个字符开始往前遍历,j 从 i + 1 开始往后遍历,这样可以保证每个子问题都已经算好了。

    • 初始化
      f[i][i] = 1 单个字符的最长回文序列是 1

    • 结果
      f[0][n - 1]

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

作者:a380922457
链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence/solution/dong-tai-gui-hua-si-yao-su-by-a380922457-3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

leetcode 16. 最长回文子序列 java

标签:http   solution   遍历   math   状态   字符   su-   char   long   

原文地址:https://www.cnblogs.com/yanhowever/p/11900667.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!