0
点赞
收藏
分享

微信扫一扫

查询oracle表空间的使用情况

最长公共子序列

leetcode1143. 最长公共子序列

题目描述

暴力递归

解题思路

代码演示

    public int longestCommonSubsequence(String text1, String text2) {
        if (text1 ==null || text2 == null || text2.length() == 0 || text1.length() == 0){
            return 0;
        }
        return process(text1.toCharArray(),text2.toCharArray(),text1.length() - 1,text2.length() - 1);
    }

    /**
     *
     * @param str1 字节数组
     * @param str2 字节数组
     * @param i 字节数组str1 的下标
     * @param j 字节数组str2 的下标
     * @return
     */
    public static int process(char[]str1,char[]str2,int i,int j ){
        //base case 都在0 位置
        if(i == 0 && j == 0){
            return str1[i] == str2[j] ? 1 : 0;
        }else if (i == 0){
            //i 来到 0 位置 相等直接返回1 不等还要继续移动str2 的指针就行比较有没有相同的
            if(str1[i] == str2[j]){
                return 1;
            }else{
                return process(str1,str2,i,j - 1);
            }
        } else if (j == 0) {
            //j来到 0 位置 相等直接返回1 不等还要继续移动str1 的指针就行比较有没有相同的
            if(str1[i] == str2[j]){
                return 1;
            }else{
                return process(str1,str2,i - 1,j);
            }

        }else {
            int p1 = 0;
            int p2 = 0;
            int p3 = 0;
            if(str1[i] != str2[j]){
            	//不等时 str1 的指针和 str2 的指针 分两种情况
            	//分别进行比较
                p1 = process(str1,str2,i,j - 1);
                p2 = process(str1,str2,i - 1,j );
            }else{
            	//相等时 同时移动 子序列加1 
                p3 = 1 +   process(str1,str2,i - 1,j - 1);     
            }
            return Math.max(p1,Math.max(p2,p3));
        }
    }

动态规划

解题思路

代码演示

    /**
     * 动态规划
     * @param text1
     * @param text2
     * @return
     */
 public static int dp(String text1, String text2){
        char[] str1 = text1.toCharArray();
        char[] str2 = text2.toCharArray();
        int N = str1.length;
        int M = str2.length;
        int[][]dp = new int[N][M];
        //根据base case 初始化
        dp[0][0] = str1[0] == str2[0] ? 1 : 0;
        //str1 来到 0 位置时
        for (int j = 1; j < M ;j++){
            dp[0][j] = str1[0] == str2[j] ? 1 : dp[0][j - 1];
        }
        //str2 来到 0 位置时
        for (int i = 1;i < N ;i++){
            dp[i][0] = str1[i] == str2[0] ? 1 : dp[i - 1][0];
        }
        for (int i = 1;i < N ;i++){
            for (int j = 1;j < M ;j++){
               
            int p1 = 0;
            int p2 = 0;
            int p3 = 0;
            if(str1[i] != str2[j]){
                p1 = dp[i][j - 1];
                p2 = dp[i - 1][j];
            }else{
                p3 = 1 + dp[i -1][j - 1];     
            }

                dp[i][j] =  Math.max(p1,Math.max(p2,p3));
            }
        }
        //返回递归调用的最初始状态
        return dp[N - 1][M - 1];
    }

动态规划专题

leetcode.486. 预测赢家

数字转字符串,有多少种转化结果

背包问题–填满背包的最大价格

leetcode 322 题 零钱兑换

举报

相关推荐

0 条评论