四、执行结果

在这里插入图片描述

五、举一反三

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

来源:力扣(LeetCode
链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence
示例 1:

输入:s = “bbbab”
输出:4
解释:一个可能的最长回文子序列为 “bbbb” 。

示例 2:

输入:s = “cbbd”
输出:2
解释:一个可能的最长回文子序列为 “bb” 。

其实本题可以理解为最长公共子序列的变形,我们可以这么想回文子序列的正序和倒序是相同,那么我把字符串s反转表示为s',那么最终转化为求两字字符串的最长子序列的长度,代码实现如下所示:

public class Solution2 {

    public int longestPalindromeSubseq(String s) {
        int n = s.length();
        //定义dp数组
        int[][] dp = new int[n + 1][n + 1];
        char[] cs1 = s.toCharArray();
        char[] cs2 = new StringBuilder(s).reverse().toString().toCharArray();
        //计算dp数组
        for(int i = 1 ; i <= n;  i++){
            for(int j = 1; j <= n; j++){
                if(cs1[i-1] == cs2[j -1]){
                    dp[i][j] = dp[i-1][j-1] +1;
                }else{
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        return dp[n][n];
    }

    public static void main(String[] args){
        String s = "aabaaba";
        Solution2 solution = new Solution2();
        System.out.println(solution.longestPalindromeSubseq(s));
    }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box"> >>
注:本文转载自blog.csdn.net的仁者乐山智者乐水的文章"https://blog.csdn.net/qq_39559641/article/details/117173662"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!