LeetCode Hot100(多维动态规划)

发布于:2025-05-30 ⋅ 阅读:(23) ⋅ 点赞:(0)

62. 不同路径

比较板子的dp,实际上就是到达一个点有两种方式,从上面来或者是左边,加起来就可以了

class Solution {
    public int uniquePaths(int m, int n) {
        int [][]arr = new int[m+2][n+2];
        arr[1][1]=1;
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(i==1&&j==1){
                    continue;
                }
                arr[i][j]+=arr[i-1][j]+arr[i][j-1];
            }
        }
        return arr[m][n];
    }
}

64. 最小路径和

跟上一题一样,该题取一下最小值即可

class Solution {
    public int minPathSum(int[][] grid) {
        if(grid.length==0){
            return 0;
        }
        for(int i=0;i<grid.length ; i ++){
            for(int j=0;j<grid[i].length;j++){
                if(i>0&&j>0){
                    grid[i][j]+=Math.min(grid[i-1][j],grid[i][j-1]);
                }
                else if(i==0){
                    if(j>0){
                        grid[i][j]+=grid[i][j-1];
                    }
                }else if(j==0){
                    if(i>0){
                        grid[i][j]+=grid[i-1][j];
                    }
                }
            }
        }
        return grid[grid.length-1][grid[grid.length-1].length-1];
    }
}

5. 最长回文子串

这边直接采取的暴力的做法,枚举每一个字符串,看看是不是回文的即可

class Solution {
    public static String longestPalindrome(String s) {
        int wei=0;
        int len=1;
        char []arr=s.toCharArray();
        for(int i=0;i<arr.length;i++){
            for(int j=i;j<arr.length;j++){
                int f=(j-i);
                int mark=0;
                for(int p=0;p<=f;p++){
                    if(arr[i+p]!=arr[j-p]){
                        mark=1;
                        break;
                    }
                }
                if(mark==0){
                    if(j-i+1>=len){
                        len=j-i+1;
                        wei=i;
                    }
                }
            }
        }

        String s2=s.substring(wei,wei+len);
       
        return s2;
    }
}

1143. 最长公共子序列

也算是比较板子的dp了,我们设dp[i][j]为以i和j为结尾的最长子序列,它实际上有两种可能,一个是i和j对应的字符相等,那么直接就是i-1,j-1加1即可,如果不同,就是i-1,j,或者i,j-1转移过来即可

class Solution {
    public static void main(String[] args) {

        longestCommonSubsequence("abcde","ace");
    }
    public static int longestCommonSubsequence(String text1, String text2) {
        int len=0;
        char []s2=text2.toCharArray();
        char []s1=text1.toCharArray();
        int [][]dp=new int[text1.length()][text2.length()];
        int maxx=0;
        for(int i=0;i<s1.length;i++){
            for(int j=0;j<s2.length;j++){
                if(s1[i]==s2[j]){
                    if(i>=1&&j>=1){
                        dp[i][j]=Math.max(dp[i-1][j-1]+1,dp[i][j]);
                    }
                    else{
                        dp[i][j]=1;
                    }
                }
                else{
                    if(i>=1){
                        dp[i][j]=Math.max(dp[i-1][j],dp[i][j]);
                    }
                    if(j>=1){
                        dp[i][j]=Math.max(dp[i][j-1],dp[i][j]);
                    }
                }
                maxx=Math.max(dp[i][j],maxx);
            }
        }

        

        return maxx;
    }

}

72. 编辑距离

与上一题几乎一致,看一下代码即可

import java.util.*;

import static java.util.Collections.reverse;

public class Main {
    public static void main(String[] args) {

        minDistance("abcde","ace");
    }
    public static int minDistance(String word1, String word2) {
        int len1 = word1.length(), len2 = word2.length();
        int[][] dp = new int[len1 + 1][len2 + 1];
        for (int i = 0; i < len1; i++)
            dp[i + 1][0] = i + 1;
        for (int i = 0; i < len2; i++)
            dp[0][i + 1] = i + 1;
        for (int i = 0; i < len1; i++) {
            for (int j = 0; j < len2; j++) {
                dp[i + 1][j + 1] = word1.charAt(i) == word2.charAt(j) ? dp[i][j]
                        : Math.min(Math.min(dp[i][j + 1], dp[i + 1][j]), dp[i][j]) + 1;
            }
        }
        return dp[len1][len2];
    }



}


网站公告

今日签到

点亮在社区的每一天
去签到