0
点赞
收藏
分享

微信扫一扫

UEFI学习笔记(六):EDK II 模块:Libraries,Drivers&Application

吴wuwu 2024-09-20 阅读 17

今日收获:回文子串,最长回文子序列

1. 回文子串

题目链接:647. - 力扣(LeetCode)

思路:

(1)dp数组的定义不再是题目的要求,而是二维的,下标 i 和 j 表示字符串对应下标的子串是不是回文串。再利用变量记录回文子串的个数

(2)初始化全为0

(3)如果当前两个字符相等,判断长度是否为0或1,满足要求则都是回文子串;如果长度大于1,那么下标向中间聚拢,如果仍然是回文子串,记录个数。

(4)遍历顺序:依据递推公式,需要下标向中间聚拢也就是左下角的值推出当前值,所以需要从上到下从左到右遍历。

方法:

class Solution {
    public int countSubstrings(String s) {
        int len=s.length();
        int result=0;

        // 字符串中从 i 到 j 的子串是不是回文串
        boolean[][] dp=new boolean[len][len];

        // 初始化
        for (int i=0;i<len;i++){
            for (int j=0;j<len;j++){
                dp[i][j]=false;
            }
        }

        // 从底向上,从左到右
        for (int i=len-1;i>=0;i--){
            for (int j=i;j<len;j++){
                if (s.charAt(i)==s.charAt(j)){
                    if (j-i<=1){
                        dp[i][j]=true;
                        result++;
                    }else {
                        dp[i][j]=dp[i+1][j-1];  // 向中间靠拢
                        if (dp[i][j]==true){
                            result++;
                        }
                    }
                }
            }
        }

        return result;
    }
}

2. 最长回文子序列

题目链接:516. - 力扣(LeetCode)

思路:

(1)dp数组表示 i 和 j 下标范围内的最长回文子序列长度

(2)初始化:递推公式不包含长度为1的回文子串,所以二维数组的对角线元素全为1

(3)递推公式:如果 i 和 j 下标上的字符相等,那么回文子序列的长度在内层子串的基础上加2;如果不相等,则取分别加上左边的字符和右边的字符中的最大值。

(4)遍历顺序:从递推公式可以看出来,当前位置依赖于左,左下,下的元素值,所以是从下到上,从左到右遍历。

方法:

class Solution {
    public int longestPalindromeSubseq(String s) {
        int len=s.length();

        // 设置为len+1,初始化较为简单
        int[][] dp=new int[len+1][len+1];

        for (int i=len-1;i>=0;i--){
            dp[i][i]=1;
            for (int j=i+1;j<len;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][len-1];
    }
}

总结:

(1)子序列和子串的区别在于,子序列可以删除元素,如果可以删除的情况不止一个就需要取其中的最大值。

(2)如果不能确定遍历顺序,可以根据递推公式,分析dp数组中当前位置的值由哪些方向的值推导出来。

举报

相关推荐

0 条评论