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

成都网站建设推进方案淘宝seo什么意思

成都网站建设推进方案,淘宝seo什么意思,网站建设 site yudwl.com,网站建设试题TOC 前言 代码随想录算法训练营day56 一、Leetcode 583. 两个字符串的删除操作 1.题目 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 示例 1: 输入: word1 "sea",…

@TOC


前言

代码随想录算法训练营day56


一、Leetcode 583. 两个字符串的删除操作

1.题目

给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。

每步 可以删除任意一个字符串中的一个字符。

示例 1:

输入: word1 = "sea", word2 = "eat" 输出: 2 解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"

示例 2:

输入:word1 = "leetcode", word2 = "etco" 输出:4

提示:

1 <= word1.length, word2.length <= 500
word1 和 word2 只包含小写英文字母

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/delete-operation-for-two-strings

2.解题思路

方法一:最长公共子序列

给定两个字符串 word1word1​ 和 word2word2​,分别删除若干字符之后使得两个字符串相同,则剩下的字符为两个字符串的公共子序列。为了使删除操作的次数最少,剩下的字符应尽可能多。当剩下的字符为两个字符串的最长公共子序列时,删除操作的次数最少。因此,可以计算两个字符串的最长公共子序列的长度,然后分别计算两个字符串的长度和最长公共子序列的长度之差,即为两个字符串分别需要删除的字符数,两个字符串各自需要删除的字符数之和即为最少的删除操作的总次数。

关于最长公共子序列,请读者参考「1143. 最长公共子序列」。计算最长公共子序列的长度的方法见「1143. 最长公共子序列的官方题解」,这里不再具体阐述。

假设字符串 word1word1​ 和 word2word2​ 的长度分别为 mm 和 nn,计算字符串 word1word1​ 和 word2word2​ 的最长公共子序列的长度,记为 lcslcs,则最少删除操作次数为 m−lcs+n−lcsm−lcs+n−lcs。

3.代码实现

```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 = 1; i <= m; i++) { char c1 = word1.charAt(i - 1); for (int j = 1; j <= n; j++) { char c2 = word2.charAt(j - 1); if (c1 == c2) { dp[i][j] = dp[i - 1][j - 1] + 1; } else { dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); } } } int lcs = dp[m][n]; return m - lcs + n - lcs; } }

```

二、Leetcode 72. 编辑距离

1.题目

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

插入一个字符
删除一个字符
替换一个字符

示例 1:

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

示例 2:

输入:word1 = "intention", word2 = "execution" 输出:5 解释: intention -> inention (删除 't') inention -> enention (将 'i' 替换为 'e') enention -> exention (将 'n' 替换为 'x') exention -> exection (将 'n' 替换为 'c') exection -> execution (插入 'u')

提示:

0 <= word1.length, word2.length <= 500
word1 和 word2 由小写英文字母组成

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/edit-distance

2.解题思路

方法一:动态规划

思路和算法

我们可以对任意一个单词进行三种操作:

插入一个字符;删除一个字符;替换一个字符。

题目给定了两个单词,设为 A 和 B,这样我们就能够六种操作方法。

但我们可以发现,如果我们有单词 A 和单词 B:

对单词 A 删除一个字符和对单词 B 插入一个字符是等价的。例如当单词 A 为 doge,单词 B 为 dog 时,我们既可以删除单词 A 的最后一个字符 e,得到相同的 dog,也可以在单词 B 末尾添加一个字符 e,得到相同的 doge;同理,对单词 B 删除一个字符和对单词 A 插入一个字符也是等价的;对单词 A 替换一个字符和对单词 B 替换一个字符是等价的。例如当单词 A 为 bat,单词 B 为 cat 时,我们修改单词 A 的第一个字母 b -> c,和修改单词 B 的第一个字母 c -> b 是等价的。

这样以来,本质不同的操作实际上只有三种:

在单词 A 中插入一个字符;在单词 B 中插入一个字符;修改单词 A 的一个字符。

这样以来,我们就可以把原问题转化为规模较小的子问题。我们用 A = horse,B = ros 作为例子,来看一看是如何把这个问题转化为规模较小的若干子问题的。

在单词 A 中插入一个字符:如果我们知道 horse 到 ro 的编辑距离为 a,那么显然 horse 到 ros 的编辑距离不会超过 a + 1。这是因为我们可以在 a 次操作后将 horse 和 ro 变为相同的字符串,只需要额外的 1 次操作,在单词 A 的末尾添加字符 s,就能在 a + 1 次操作后将 horse 和 ro 变为相同的字符串;在单词 B 中插入一个字符:如果我们知道 hors 到 ros 的编辑距离为 b,那么显然 horse 到 ros 的编辑距离不会超过 b + 1,原因同上;修改单词 A 的一个字符:如果我们知道 hors 到 ro 的编辑距离为 c,那么显然 horse 到 ros 的编辑距离不会超过 c + 1,原因同上。

那么从 horse 变成 ros 的编辑距离应该为 min(a + 1, b + 1, c + 1)。

注意:为什么我们总是在单词 A 和 B 的末尾插入或者修改字符,能不能在其它的地方进行操作呢?答案是可以的,但是我们知道,操作的顺序是不影响最终的结果的。例如对于单词 cat,我们希望在 c 和 a 之间添加字符 d 并且将字符 t 修改为字符 b,那么这两个操作无论为什么顺序,都会得到最终的结果 cdab。

你可能觉得 horse 到 ro 这个问题也很难解决。但是没关系,我们可以继续用上面的方法拆分这个问题,对于这个问题拆分出来的所有子问题,我们也可以继续拆分,直到:

字符串 A 为空,如从 转换到 ro,显然编辑距离为字符串 B 的长度,这里是 2;字符串 B 为空,如从 horse 转换到 ,显然编辑距离为字符串 A 的长度,这里是 5。

因此,我们就可以使用动态规划来解决这个问题了。我们用 D[i][j] 表示 A 的前 i 个字母和 B 的前 j 个字母之间的编辑距离。

72_fig1.PNG

如上所述,当我们获得 D[i][j-1],D[i-1][j] 和 D[i-1][j-1] 的值之后就可以计算出 D[i][j]。

D[i][j-1] 为 A 的前 i 个字符和 B 的前 j - 1 个字符编辑距离的子问题。即对于 B 的第 j 个字符,我们在 A 的末尾添加了一个相同的字符,那么 D[i][j] 最小可以为 D[i][j-1] + 1;D[i-1][j] 为 A 的前 i - 1 个字符和 B 的前 j 个字符编辑距离的子问题。即对于 A 的第 i 个字符,我们在 B 的末尾添加了一个相同的字符,那么 D[i][j] 最小可以为 D[i-1][j] + 1;D[i-1][j-1] 为 A 前 i - 1 个字符和 B 的前 j - 1 个字符编辑距离的子问题。即对于 B 的第 j 个字符,我们修改 A 的第 i 个字符使它们相同,那么 D[i][j] 最小可以为 D[i-1][j-1] + 1。特别地,如果 A 的第 i 个字符和 B 的第 j 个字符原本就相同,那么我们实际上不需要进行修改操作。在这种情况下,D[i][j] 最小可以为 D[i-1][j-1]。

那么我们可以写出如下的状态转移方程:

若 A 和 B 的最后一个字母相同:D[i][j]=min⁡(D[i][j−1]+1,D[i−1][j]+1,D[i−1][j−1])=1+min⁡(D[i][j−1],D[i−1][j],D[i−1][j−1]−1)D[i][j]​=min(D[i][j−1]+1,D[i−1][j]+1,D[i−1][j−1])=1+min(D[i][j−1],D[i−1][j],D[i−1][j−1]−1)​若 A 和 B 的最后一个字母不同:D[i][j]=1+min⁡(D[i][j−1],D[i−1][j],D[i−1][j−1])D[i][j]=1+min(D[i][j−1],D[i−1][j],D[i−1][j−1])

所以每一步结果都将基于上一步的计算结果,示意如下:

72_fig2.PNG

对于边界情况,一个空串和一个非空串的编辑距离为 D[i][0] = i 和 D[0][j] = j,D[i][0] 相当于对 word1 执行 i 次删除操作,D[0][j] 相当于对 word1执行 j 次插入操作。

综上我们得到了算法的全部流程。

3.代码实现

```java class Solution { public int minDistance(String word1, String word2) { int n = word1.length(); int m = word2.length();

// 有一个字符串为空串if (n * m == 0) {return n + m;}// DP 数组int[][] D = new int[n + 1][m + 1];// 边界状态初始化for (int i = 0; i < n + 1; i++) {D[i][0] = i;}for (int j = 0; j < m + 1; j++) {D[0][j] = j;}// 计算所有 DP 值for (int i = 1; i < n + 1; i++) {for (int j = 1; j < m + 1; j++) {int left = D[i - 1][j] + 1;int down = D[i][j - 1] + 1;int left_down = D[i - 1][j - 1];if (word1.charAt(i - 1) != word2.charAt(j - 1)) {left_down += 1;}D[i][j] = Math.min(left, Math.min(down, left_down));}}return D[n][m];
}

}

```

http://www.15wanjia.com/news/40567.html

相关文章:

  • 凉山州住房与城乡建设局网站微信小程序怎么做店铺
  • 链接分析属于网站开发百度的官方网站
  • 网站建设哪家公司靠谱搜狗推广
  • 网站开发设计大赛seo视频教学网站
  • 建筑人才网职位邀约是什么意思关键词优化怎么做
  • 有什么做任务的网站吗百度首页网址是多少
  • 微网站简介如何建立自己的网页
  • 可以直接做海报的网站扬州百度seo
  • 做网站的软件工程师互联网销售
  • wordpress精华主题一键优化大师
  • 网页制作素材网站培训机构哪家最好
  • 苏州做网站需要多少钱长沙网络营销学校
  • 香港做网站公司有哪些百度手机管家
  • 做网站写的代号好跟不好的区别最好用的搜索神器
  • 企业所得税优惠政策2021年seo 页面
  • 阿里巴巴网站怎样做的漂亮erp123登录入口
  • 怎么一个网站做的竞价企业文化案例
  • jsp做网站 案例如何添加百度指数
  • 做网站怎么打空格宁波seo推广
  • 东单网站建设百度小说风云榜
  • 百度网站安全在线检测百度收录好的免费网站
  • 河南建设监理协会新网站如何自己开个网站平台
  • 钢材网站模板宁夏百度公司
  • 有链接的网站怎么做今日头条新闻发布
  • 衡阳网站建设步骤网络推广优化方案
  • 网站建设会议通知今日新闻十大头条内容
  • 无锡网站建设技术外包谷歌chrome浏览器官方下载
  • 招商网站建设多少钱seo搜索引擎优化工具
  • 公司电商网站建设方案短视频运营
  • 空白的网站怎么建设危机公关