当前位置: 首页 > news >正文

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

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

文章目录

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

一、62. 不同路径

题目链接:https://leetcode.cn/problems/unique-paths/description/?envType=study-plan-v2&envId=top-100-liked
思路:求不同路径,任意一个位置都可以从它的上方和左方推出,也就是dp[i][j] = dp[i][j-1] + dp[i-1][j],压缩数组为dp[j] = dp[j] + dp[j-1];
在这里插入图片描述

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
思路:求最小路径和,每一个位置可以从当前位置的上方和左方推出,但是只需要这两者中的最小值加上当前值,即可得到结构。
dp[j] = Math.min(dp[j], dp[j-1]) + nums[i][j]。
在这里插入图片描述

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

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” ,定义dp[i][j]表示区间[0, i] 和区间[0, j]中以text1[i]和text2[j]字符为结尾,如果二者相等则 dp[i+1][j+1] = dp[i][j] + 1;如果二者不等则 dp[i+1][j+1] = Math.max(dp[i+1][j], dp[i][j+1]);
1 1 1
1 1 1
1 2 2
1 2 2
1 2 3

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
思路:求最少操作步骤,定义dp[i][j]表text1以索引 i 结尾,text2以索引 j 结尾的最长相等子序列,当结尾相等,自然操作数延续上一个位置,dp[i+1][j+1] = dp[i][j];,如果不等,可以考虑从左边,上边,左上角。
0 1 2 3
1 1 2 3
2 2 2 2
3 2 2
4
0

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];}
}
http://www.lryc.cn/news/322404.html

相关文章:

  • 前端vue实现甘特图
  • SQLiteC/C++接口详细介绍之sqlite3类(十五)
  • 每日三个JAVA经典面试题(十八)
  • RPC 和 序列化
  • 【原创】三十分钟实时数据可视化网站前后端教程 Scrapy + Django + React 保姆级教程向
  • MySQL的备份
  • Linux 磁盘的一生
  • C#配置连接数据库字段
  • QCOM和其他常见芯片平台术语缩写
  • css页面布局
  • 6、Design Script之列表
  • Mysql数据库的多实例部署
  • 陈巍:Sora大模型技术精要万字详解(上)——原理、关键技术、模型架构详解与应用
  • JS原型和原型链的理解
  • 力扣题单(小白友好)
  • 王道c语言ch11-单链表的新建、插入、删除例题
  • 蓝桥杯刷题--python-23
  • 蓝桥杯刷题--python-24
  • 面向对象(C# )
  • Lombok:@Cleanup资源释放利器
  • IoT 物联网场景中 LoRa + 蓝牙Bluetooth 室内场馆高精定位技术全面解析
  • SpringCloudAlibaba系列之Seata实战
  • 蓝桥杯day5刷题日记-分巧克力-天干地支-求和
  • C++ ostringstream用法详解
  • 并发编程所需的底层基础
  • 各种小功能
  • vue前端解析jwt
  • 【Flutter 面试题】Flutter如何进行本地存储和缓存数据?
  • Docker 笔记(八)--Dockerfile
  • C语言每日一题06