1.不同路径、最长公共子序列

不同路径

https://leetcode-cn.com/problems/unique-paths-ii/

  public int uniquePaths(int m, int n) {
        int[][] A= new int[m][n];
        // 初始化列
        for(int i = 0 ; i < m ; i++) {
            A[i][0] = 1;
        }
        // 初始化行
        for(int j = 0 ; j < n ; j++) {
            A[0][j] = 1;
        }
        for(int i = 1 ; i < m ; i++) {
            for(int j = 1 ; j < n ; j++) {
               // 递推公式
               A[i][j] = A[i-1][j] + A[i][j-1];
            }
        }
        return A[m-1][n-1];
    }
> 优化
   public int uniquePaths(int m, int n) {
       int[] cur = new int[n];
        // 一行初始化为1
       Arrays.fill(cur,1);
       for (int i = 1;i < m;i++) {
           for (int j = 1;j < n;j++) {
            //    逐行进行递推
               cur[j] += cur[j - 1];
           }
       }
        return cur[n - 1];
    }

   public int uniquePathsWithObstacles(int[][] A) {
        int m = A.length;
        int n = A[0].length;
        int step[][] = new int[m][n];
        // 初始化第一列,只要碰到一个1,那么后边都无法走到
        for (int i = 0; i < m; i++) {
            if (A[i][0] == 1) {
                break;
            }
            step[i][0] = 1;
        }
        // 初始化第一行,只要碰到一个1,那么后边都无法走到
        for (int j = 0; j < n; j++) {
            if (A[0][j] == 1) {
                break;
            }
            step[0][j] = 1;

        }
        // 在没有障碍物的情况下,到达某一点只能从左边或者上边
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                step[i][j] = A[i][j] == 1 ? 0 : step[i - 1][j] + step[i][j - 1];
            }
        }
        return step[m - 1][n - 1];
    }

      > 优化
     public int uniquePathsWithObstacles(int[][] A) {
        int width = A[0].length;
        int[] dp = new int[width];
        // 假设没有障碍
        dp[0] = 1;
        for (int[] row : A) {
            for (int j = 0; j < width; j++) {
                if (row[j] == 1)
                    // 有障碍再置0
                    dp[j] = 0;
                else if (j > 0)
                    dp[j] += dp[j - 1];
            }
        }
        return dp[width - 1];
    }

最长公共子序列

https://leetcode-cn.com/problems/longest-common-subsequence/

    public int longestCommonSubsequence(String text1, String text2) {
        // s1 = ".....A" , s2 = "......A"
        // 两个字符串分别从后往前看
        // 若当前位置不等,则max(dp[s1-1,s2],dp[s1,s2-1])
        // 若当前位置相等,则dp[s1-1,s2-1]+1;
        int m = text1.length();
        int n = text2.length();
        int[][] dp = new int[m + 1][n + 1];
        for (int i = 1;i <= m;i++) {
            for (int j = 1;j <= n;j++) {
                if (text1.charAt(i - 1) != text2.charAt(j - 1)) {
                    dp[i][j] = Math.max(dp[i - 1][j] , dp[i][j - 1]);
                } else {
                    dp[i][j] =dp[i - 1][j - 1] + 1;
                }
            } 
        } 
        return dp[m][n];
    }
posted @ 2021-11-15 09:03  哟喝  阅读(34)  评论(0)    收藏  举报