文章目录

  • 题目描述
  • 思路 && 代码 O(n2n^2n2)、O(n2n^2n2)
    • 二刷

打卡第十三天~

题目描述

  • 感觉和正则表达式匹配这道题很像:同样的两个字符串,同样的二维数组dp,同样的hard。。= =

思路 && 代码 O(n2n^2n2)、O(n2n^2n2)

  • 使用动态规划的做法,同样多开一行、一列来进行边界处理。
  • dp[i][j]:以[0, i] 和 [0, j]的子串,word1Son转化成word2Son的最少操作数字
  • 具体做法见注释的 part 和 Case~
  • 主要代码应该是注释 part 2.2 部分的代码,可以这么理解
    0. 对于当前 dp[i][j] 的选取值,i、j匹配的情况显而易见是直接选取dp[i - 1][j - 1]最优

    1. 不匹配的情况,有三个最优子结构:左边的dp[i][j - 1],上边的dp[i - 1][j],以及左上的dp[i -1][j - 1]。经过思考,我们可以发现这三个最优子结构,可以分别通过增、删、减的方式(操作数 + 1),转移到 dp[i][j] 的状态。
    2. 那么显而易见,选取三个子结构的最小值,再增加一个操作数就是当前的最优选择~
class Solution {public int minDistance(String word1, String word2) {// initint m = word1.length();int n = word2.length();// dp[i][j]:以[0, i] 和 [0, j]的子串,word1Son转化成word2Son的最少操作数字int[][] dp = new int[m + 1][n + 1];// part 1:边界:// part 1.1: 直接插入for(int i = 0; i <= n; i++) {dp[0][i] = i;}// part 1.2: 直接删除for(int i = 0; i <= m; i++) {dp[i][0] = i;}// part 2:具体规划过程for(int i = 1; i <= m; i++) {for(int j = 1; j <= n; j++) {// part 2.2: 当前字符不匹配:if(word1.charAt(i - 1) != word2.charAt(j - 1)) {// Case 1: 删除当前i字符 + dp[i - 1][j](删)// Case 2: dp[i][j - 1] + 插入j字符(插)// Case 3: dp[i - 1][j - 1] + i 和 j 对着替换一个。(替)// 三种选择,选取步骤最少的一个dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;}// part 2.1: 直接匹配,不用操作else {dp[i][j] = dp[i - 1][j - 1];}}}return dp[m][n];}
}

二刷

  • 一如既往地明了,有效代码其实就12行
class Solution {public int minDistance(String word1, String word2) {// dp[i][j]:把 word1[0][i] 变成 word2[0][j] 需要的步数int[][] dp = new int[word1.length() + 1][word2.length() + 1]; // 直接删成 word2for(int i = 0; i <= word1.length(); i++) {dp[i][0] = i;}// 直接插成 word2for(int i = 0; i <= word2.length(); i++) {dp[0][i] = i;}for(int i = 1; i <= word1.length(); i++) {for(int j = 1; j <= word2.length(); j++) {// 相等,相当于不用动,直接取上一阶的结果if(word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];}// 不相等,取改、删、插的最小值 + 1.else {dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1])) + 1;}}}return dp[word1.length()][word2.length()];}
}

【LeetCode笔记】72. 编辑距离(Java、字符串、动态规划)相关推荐

  1. leetcode:72. 编辑距离

    题目来源 leetcode 题目描述 class Solution {public:int minDistance(string word1, string word2) {} }; 题目解析 什么叫 ...

  2. [leetcode] 72. 编辑距离(二维动态规划)

    72. 编辑距离 再次验证leetcode的评判机有问题啊!同样的代码,第一次提交超时,第二次提交就通过了! 此题用动态规划解决. 这题一开始还真难到我了,琢磨半天没有思路.于是乎去了网上喵了下题解看 ...

  3. 【LeetCode】72. 编辑距离 【动态规划】

    题目链接:https://leetcode-cn.com/problems/edit-distance/ 题目描述 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word ...

  4. 【LeetCode笔记】438. 找到字符串中所有字母异位词(Java、字符串、滑动窗口)

    题目描述 因为自己写的复杂度已经到了 O(n),就没有再参考题解的优化了 更新:滑动窗口方法 思路 & 代码 用一个 int[ ] count 来存储当前判断子串的各字母出现次数 getCou ...

  5. [Leetcode][第415题][JAVA][字符串相加][双指针]

    [问题描述][简单] [解答思路] 1. 双指针 从两个字符串最后开始处理 对齐字符串 添加当前位 int c = a+b+cnt; cnt为进位 超过长度的补"0" 要注意最后有 ...

  6. [Leetcode][第5458题][JAVA][字符串的好分割数目][双指针][HashSet]

    [问题描述]5458. 字符串的好分割数目[中等] [解答思路] 1. 双指针 前面的搜索前面的个数和,后面的搜索后面的个数和 时间复杂度:O(N^2) 空间复杂度:O(1) class Soluti ...

  7. [Leetcode]第[43]题[JAVA][字符串相乘][字符串相加]

    [问题描述][中等] [解答思路] 1. 普通竖式 **复杂度:O(N^2) ** class Solution {/*** 计算形式* num1* x num2* ------* result*/p ...

  8. 【LeetCode笔记】1143. 最长公共子序列(Java、动态规划、字符串)

    文章目录 题目描述 思路 & 代码 二刷 三刷 题目描述 算是很高频的面试题了,而且题号还挺后的 思路 & 代码 注意:dp[i]][j] 和 charAt(i) 有1的下标差(dp初 ...

  9. 代码随想录算法训练营Day56动态规划:583.两个字符串的删除操作,72.编辑距离

    583.两个字符串的删除操作 文章链接:代码随想录 (programmercarl.com) 思路:动规五步曲 (1)确定dp数组及其含义 dp[i][j]表示字符串1在区间[0, i - 1]和字符 ...

  10. Java实现 LeetCode 72 编辑距离

    72. 编辑距离 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字 ...

最新文章

  1. Fiddler无法抓取HTTPS的问题,Fiddler证书无法安装终极解决方案,
  2. DOM编程中,提高程序运行速度需要注意的一些点
  3. WebP 大战 JPEG,谁才是真正的王者?
  4. OpenCV限制对比度自适应直方图均衡(CLAHE)的实例(附完整代码)
  5. 随便写写2014创业记(二)
  6. 成功使用Windows Live Writer 2010发布日志
  7. ARM中断返回地址详细分析
  8. python自动交易软件排名_量化投资软件排名 哪个量化交易软件最好用
  9. win10+Ubuntu双系统设置默认系统启动项为win10
  10. 开源项目推荐 | 面向智慧城市的计算机视觉算法基准测试 Benchmark for Smart City上线
  11. linux查看磁盘naa,linux查看计算机硬件信息
  12. 顺序队列为空的条件_合成中心丙烯压缩空冷器冬季防冻及自动化运行项目顺利完成...
  13. 【echarts】柱状图正负值双色
  14. 如何获取Java运行时的性能数据
  15. Typora基础用法:pandoc安装,导入导出word文档,pdf文件。设置图片目录
  16. Swiper4.0:H5手机端滑屏判断当前页Index并且触发动画(slideChangeTransitionEnd与swiper.activeIndex)
  17. Crazy Learning for Day 7
  18. 打造超精简绿色 迅雷 和 IDM附详细教程:
  19. 工作汇报ppt案例_美国苹果公司内部年终汇报PPT曝光!网友:职场范十足,学习了...
  20. HelloWorld程序编写(用Java)

热门文章

  1. 新视窗java_《计算机组成原理实验》教学大纲 - 兰州大学信息科学与工程学院.DOC...
  2. java简单小项目_Java简易抽奖系统小项目
  3. php flush nginx,Nginx+phpfastcgi下flush输出问题
  4. python深浅拷贝 面试_Python面试宝典之基础篇-02
  5. 记录用户转成超级用户的文件名字_一分钟了解Linux用户
  6. mysql 命令 kill_MySQL之死锁检测
  7. 进程同步,异步,互斥
  8. 三个数据集与deploy.prototxt
  9. 安卓逆向_22( 二 ) --- Xposed 学习记录
  10. 王爽 汇编语言第三版 问题 7.9 将 datasg 段中前4个字母变成大写(汇编中的双重循环)