力扣爆刷第101天之hot100五连刷91-95

力扣爆刷第101天之hot100五连刷91-95

文章目录

      • 力扣爆刷第101天之hot100五连刷91-95
      • [一、62. 不同路径](#一、62. 不同路径)
      • [二、64. 最小路径和](#二、64. 最小路径和)
      • [三、5. 最长回文子串](#三、5. 最长回文子串)
      • [四、1143. 最长公共子序列](#四、1143. 最长公共子序列)
      • [五、72. 编辑距离](#五、72. 编辑距离)

一、62. 不同路径

题目链接:https://leetcode.cn/problems/unique-paths/description/?envType=study-plan-v2\&envId=top-100-liked

思路:求不同路径,任意一个位置都可以从它的上方和左方推出,也就是dpij = dpij-1 + dpi-1j,压缩数组为dpj = dpj + dpj-1;

java 复制代码
class Solution {
    public int uniquePaths(int m, int n) {
        int[] dp = new int[n];
        dp[0] = 1;
        for(int i = 0; i < m; i++) {
            for(int j = 1; j < n; j++) {
                dp[j] = dp[j] + dp[j-1];
            }
        }
        return dp[n-1];
    }
}

二、64. 最小路径和

题目链接:https://leetcode.cn/problems/minimum-path-sum/description/?envType=study-plan-v2\&envId=top-100-liked

思路:求最小路径和,每一个位置可以从当前位置的上方和左方推出,但是只需要这两者中的最小值加上当前值,即可得到结构。

dpj = Math.min(dpj, dpj-1) + numsij

java 复制代码
class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        int[] dp = new int[n+1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        
        for(int i = 0; i < m; i++) {
            for(int j = 1; j <= n; j++) {
                int t = Math.min(dp[j], dp[j-1]);
                t = t == Integer.MAX_VALUE ? 0 : t;
                dp[j] = t + grid[i][j-1];
            }
        }
        return dp[n];
    }
}

三、5. 最长回文子串

题目链接:https://leetcode.cn/problems/longest-palindromic-substring/description/?envType=study-plan-v2\&envId=top-100-liked

思路:求最长回文子串需要遍历所有的位置,从每一个位置开始,向两边扩散,可以是单点中心扩散,可以是双点中心扩散,然后遍历判断记录即可。

java 复制代码
class Solution {
    public String longestPalindrome(String s) {
        String max = "";
        for(int i = 0; i < s.length(); i++) {
            String s1 = find(s, i, i);
            String s2 = find(s, i, i+1);
            max = s1.length() > max.length() ? s1 : max;
            max = s2.length() > max.length() ? s2 : max;
        }
        return max;
    }

    String find(String s, int left, int right) {
        while(left >= 0 && right < s.length()) {
            if(s.charAt(left) == s.charAt(right)) {
                left--;
                right++;
            }else{
                break;
            }
        }
        return s.substring(left+1, right);
    }
}

四、1143. 最长公共子序列

题目链接:https://leetcode.cn/problems/longest-common-subsequence/description/?envType=study-plan-v2\&envId=top-100-liked

思路:求最长公共子序列,如text1 = "abcde", text2 = "ace" ,定义dpij表示区间0, i 和区间0, j中以text1i和text2j字符为结尾,如果二者相等则 dpi+1j+1 = dpij + 1;如果二者不等则 dpi+1j+1 = Math.max(dpi+1j, dpij+1);

1 1 1

1 1 1

1 2 2

1 2 2

1 2 3

java 复制代码
class Solution {
     public int longestCommonSubsequence(String text1, String text2) {
        int m = text1.length(), n = text2.length();
        int[][] dp = new int[m+1][n+1];
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(text1.charAt(i) == text2.charAt(j)) {
                    dp[i+1][j+1] = dp[i][j] + 1;
                }else{
                    dp[i+1][j+1] = Math.max(dp[i+1][j], dp[i][j+1]);
                }
            }
        }
        return dp[m][n];
    }
}

五、72. 编辑距离

题目链接:https://leetcode.cn/problems/edit-distance/description/?envType=study-plan-v2\&envId=top-100-liked

思路:求最少操作步骤,定义dpij表text1以索引 i 结尾,text2以索引 j 结尾的最长相等子序列,当结尾相等,自然操作数延续上一个位置,dpi+1j+1 = dpij;,如果不等,可以考虑从左边,上边,左上角。

0 1 2 3

1 1 2 3

2 2 2 2

3 2 2

4

0

java 复制代码
class Solution {
   public int minDistance(String word1, String word2) {
        int m = word1.length(), n = word2.length();
        int[][] dp = new int[m+1][n+1];
        for(int i = 0; i < dp.length; i++) dp[i][0] = i;
        for(int i = 0; i < dp[0].length; i++) dp[0][i] = i;
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(word1.charAt(i) == word2.charAt(j)) {
                    dp[i+1][j+1] = dp[i][j];
                }else{
                    dp[i+1][j+1] = Math.min(Math.min(dp[i+1][j], dp[i][j+1]), dp[i][j]) + 1;
                }
            }
        }
        return dp[m][n];
    }
}
相关推荐
好评笔记10 分钟前
深度学习面试八股—— GRU(Gated Recurrent Unit)
人工智能·rnn·深度学习·算法·机器学习·gru·校招
搞科研的小刘选手16 分钟前
【智能计算方向专题研讨会】第三届智能计算与数据分析国际学术会议(ICDA 2026)
大数据·算法·机器学习·数据挖掘·数据分析·可视化·计算
量化君也22 分钟前
桥水基金全天候策略拆解,构建中国ETF躺平版策略
大数据·人工智能·python·算法·金融·业界资讯
蓦然回首却已人去楼空30 分钟前
画图专用文档
算法
洛水水32 分钟前
【力扣100题】78.在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
江屿风33 分钟前
C++图论基础拓扑排序算法流食般投喂
开发语言·c++·笔记·算法·排序算法
海棠AI实验室40 分钟前
AI 时代文献综述:从检索到成稿的 RAG 五步法
windows·算法·自动化·llm·rag
H1785350909640 分钟前
SolidWorks_基于草图的实体特征14_扫描扭转与控制
前端·人工智能·算法·3d建模·solidworks
黄金龙PLUS43 分钟前
基于ARX结构的新型序列密码算法FlashLight
算法·网络安全·密码学·哈希算法·同态加密
洛水水1 小时前
【力扣100题】77.搜索二维矩阵
算法·leetcode·矩阵