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

广东网站建设网站建阅读网站

广东网站建设网站,建阅读网站,门户网站需要哪些人,同里做网站LeetCode 72 - 编辑距离 (Edit Distance) 是经典的动态规划问题,重点在于掌握基本的二维动态规划算法,理解动态规划的状态定义与转移,同时还能扩展到许多字符串匹配变体问题。这道题在算法和面试中的重要性极高,以下是解法及相关变…

LeetCode 72 - 编辑距离 (Edit Distance) 是经典的动态规划问题,重点在于掌握基本的二维动态规划算法,理解动态规划的状态定义与转移,同时还能扩展到许多字符串匹配变体问题。这道题在算法和面试中的重要性极高,以下是解法及相关变体总结。


题目描述

  • 输入:两个字符串 word1word2
  • 要求:计算将 word1 转化为 word2 所需的最少操作数。
  • 操作包括:
    1. 插入一个字符
    2. 删除一个字符
    3. 替换一个字符

示例

输入: word1 = "horse", word2 = "ros"
输出: 3
解释:
horse -> rorse (替换 'h' -> 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

解法及分析

方法 1:二维动态规划(DP 表格法)

思路
  1. 定义状态:

    • dp[i][j] 表示将 word1[0..i-1] 转换为 word2[0..j-1] 的最小编辑距离。
    • 下标 ij 表示字符串当前考虑的前缀长度。
  2. 状态转移方程:

    • 如果 word1[i-1] == word2[j-1]
      dp[i][j] = dp[i-1][j-1]  // 两字符匹配,无需额外操作
      
    • 如果 word1[i-1] != word2[j-1],则尝试三种操作来转换:
      1. 插入dp[i][j-1] + 1 —— 插入一个字符使两字符串对齐。
      2. 删除dp[i-1][j] + 1 —— 删除当前字符。
      3. 替换dp[i-1][j-1] + 1 —— 替换一个字符。
      dp[i][j] = min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]) + 1
      
  3. 边界:

    • dp[0][j] = j (将空字符串变为 word2,需要插入 j 个字符)。
    • dp[i][0] = i (将 word1 转为空字符串,需删除 i 个字符)。
代码模板
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 <= m; i++) dp[i][0] = i;for (int j = 0; j <= n; j++) dp[0][j] = j;// 动态规划填表for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 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[m][n]; // 返回最终结果}
}
复杂度分析
  • 时间复杂度:O(m * n),其中 mn 是两个字符串的长度。
  • 空间复杂度:O(m * n),用于存储 dp 表。

方法 2:滚动数组优化空间(1D 优化)

核心思想

由于 dp[i][j] 的计算只依赖于当前行和上一行,因此可以用两个一维数组滚动更新,优化空间复杂度到 O(n)。

代码模板
class Solution {public int minDistance(String word1, String word2) {int m = word1.length(), n = word2.length();int[] prev = new int[n + 1], curr = new int[n + 1];// 初始化第一行for (int j = 0; j <= n; j++) prev[j] = j;// 动态规划只用当前行和上一行for (int i = 1; i <= m; i++) {curr[0] = i; // 初始化当前行第一列for (int j = 1; j <= n; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {curr[j] = prev[j - 1]; // 无操作} else {curr[j] = Math.min(prev[j - 1], Math.min(curr[j - 1], prev[j])) + 1;}}// 滚动数组int[] temp = prev;prev = curr;curr = temp;}return prev[n];}
}
复杂度分析
  • 时间复杂度:O(m * n),与上一方法相同。
  • 空间复杂度:O(n),只需两个一维数组。

方法 3:递归 + 记忆化搜索(自顶向下)

核心思想
  • 将问题分解为子问题,并对重复子问题的解做缓存。
  • 递归定义:
    • 如果字符相等:dfs(word1, i, word2, j) = dfs(word1, i-1, word2, j-1)
    • 如果字符不等:取三种操作的最小值:
      dfs(word1, i, word2, j) = min(dfs(word1, i-1, word2, j-1) + 1, // 替换dfs(word1, i-1, word2, j) + 1,   // 删除dfs(word1, i, word2, j-1) + 1    // 插入
      )
      
代码模板
class Solution {public int minDistance(String word1, String word2) {int[][] memo = new int[word1.length()][word2.length()];for (int[] row : memo) Arrays.fill(row, -1);return dfs(word1, word1.length() - 1, word2, word2.length() - 1, memo);}private int dfs(String word1, int i, String word2, int j, int[][] memo) {if (i < 0) return j + 1; // word1 空,返回插入操作数if (j < 0) return i + 1; // word2 空,返回删除操作数if (memo[i][j] >= 0) return memo[i][j]; // 缓存子问题解if (word1.charAt(i) == word2.charAt(j)) { // 字符匹配memo[i][j] = dfs(word1, i - 1, word2, j - 1, memo);} else { // 字符不同memo[i][j] = Math.min(dfs(word1, i - 1, word2, j - 1, memo), Math.min(dfs(word1, i - 1, word2, j, memo), dfs(word1, i, word2, j - 1, memo)))+ 1;}return memo[i][j];}
}
复杂度分析
  • 时间复杂度:O(m * n),每个 (i, j) 状态只计算一次。
  • 空间复杂度:O(m * n),用于记忆化数组。

经典变体问题

  1. 变体 1:只允许插入/删除操作

    • 假设 word1 转换到 word2 仅允许插入和删除字符。
    • 思路:编辑距离简化为 LCS (最长公共子序列) 问题。
  2. 变体 2:变为回文的最小编辑距离

    • 给定字符串 s,求变为回文的最少编辑距离。
    • 思路:将问题转化为 sreverse(s) 的编辑距离问题。
  3. 变体 3:匹配相似度问题

    • 计算两个字符串的相似性。例如转换两字符串的最少操作数是否小于等于 k
  4. 变体 4:带代价的编辑距离

    • 插入、删除、替换不同操作有不同代价时,求最小编辑距离。
    • 修改状态转移关系即可。

快速 AC 总结

  1. 直接背二维动态规划模板。
  2. 练习滚动数组优化和记忆化搜素,注意空间优化。
  3. 掌握变体问题(LCS、回文问题)并灵活转化。
  4. 思路转化为代码时,优先理清边界初始条件。

文章转载自:

http://hFrcdf9h.rjcqb.cn
http://Be7pVHXl.rjcqb.cn
http://7QMszz40.rjcqb.cn
http://7OX833oZ.rjcqb.cn
http://rwpQQIfM.rjcqb.cn
http://TRzBMNMD.rjcqb.cn
http://vyLxcvEz.rjcqb.cn
http://EZymWQmd.rjcqb.cn
http://JDgoSNfh.rjcqb.cn
http://2yoB8V0e.rjcqb.cn
http://amnjzQ31.rjcqb.cn
http://KZkTGsyx.rjcqb.cn
http://SUkMv2al.rjcqb.cn
http://CBprAY0r.rjcqb.cn
http://zxEnCcZR.rjcqb.cn
http://f2i79sl3.rjcqb.cn
http://522JZ2hj.rjcqb.cn
http://8nQ4t3PG.rjcqb.cn
http://KxXtNsTn.rjcqb.cn
http://wq62W32B.rjcqb.cn
http://mX0MJWeQ.rjcqb.cn
http://QNXXi38R.rjcqb.cn
http://dO9muswZ.rjcqb.cn
http://oX8fAHit.rjcqb.cn
http://tnQTnezh.rjcqb.cn
http://1GyWFY6V.rjcqb.cn
http://JS9q0LWK.rjcqb.cn
http://ke6KMKKU.rjcqb.cn
http://yAsCPR6q.rjcqb.cn
http://2Fk7C889.rjcqb.cn
http://www.dtcms.com/wzjs/648753.html

相关文章:

  • 陕西西安网站建设公司哪家好wordpress支持手机适应
  • 芜湖市公司网站建设哪家好成都建模培训
  • 网站建设与维护方案营销型网站制作方案
  • 网站里网格怎么做做模版网站需要租服务器吗
  • 上海市做网站的公司自己怎么做网页
  • 唐山官方网站建设怎么样做网站或产品推广
  • 山东室内设计学校网站怎么做一盘优化排名
  • 河北省建设安全监督站的网站网络规划设计师企业数据中心机房建设
  • 做网站需要了解域名管理
  • 莱州市双语网站宁波网站建设使用技巧分享
  • 怎么在网站做浮动图标工程承包信息
  • 接单子做网站安卓app开发工具
  • 做网站的协议给网站做app
  • 招标网站建设wordpress 头条采集
  • 青岛做一个网站多少钱wordpress xiu
  • 做理财的网站广州市口碑seo推广外包
  • 域名注册空间网站夜间app排行榜
  • 网站建设执行力中航建设集团有限公司网站
  • 网站极简设计做网站旅游销售
  • 在婚纱店做网站优化网站怎么做可以合法让别人充钱
  • 福州网站建设思企app定制开发商城
  • 四川省城乡建设网网站资源网站免费的
  • 图片摄影网站网络营销推广的
  • 对网站建设课程的心得体会python做简单网站
  • 中小企业网站建设与管理 王耀建立网站的服务器
  • 哪个cms方便快速建站房屋设计在线设计网站
  • 地方志网站建设方案网站建设项目可行性研究报告
  • 衡水建网站wordpress标签拼音
  • 网站改版方案案例网站空间域名一次性收费还是一年一算
  • 怎么修改网站首页logo网站建设毕业设计中期检查