iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++怎么编辑距离
  • 296
分享到

C++怎么编辑距离

2023-06-19 13:06:53 296人浏览 八月长安
摘要

这篇文章主要介绍“c++怎么编辑距离”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++怎么编辑距离”文章能帮助大家解决问题。编辑距离Example 1:Input: Word1 = "h

这篇文章主要介绍“c++怎么编辑距离”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++怎么编辑距离”文章能帮助大家解决问题。

编辑距离

Example 1:

Input: Word1 = "horse", word2 = "ros"
Output: 3
Explanation:
horse -> rorse (replace "h" with "r")
rorse -> rose (remove "r")
rose -> ros (remove "e")

Example 2:

Input: word1 = "intention", word2 = "execution"
Output: 5
Explanation:
intention -> inention (remove "t")
inention -> enention (replace "i" with "e")
enention -> exention (replace "n" with "x")
exention -> exection (replace "n" with "c")
exection -> execution (insert "u")

这道题让求从一个字符串转变到另一个字符串需要的变换步骤,共有三种变换方式,插入一个字符,删除一个字符,和替换一个字符。题目乍眼一看并不难,但是实际上却暗藏玄机,对于两个字符串的比较,一般都会考虑一下用 HashMap 统计字符出现的频率,但是在这道题却不可以这么做,因为字符串的顺序很重要。还有一种比较常见的错误,就是想当然的认为对于长度不同的两个字符串,长度的差值都是要用插入操作,然后再对应每位字符,不同的地方用修改操作,但是其实这样可能会多用操作,因为删除操作有时同时可以达到修改的效果。比如题目中的例子1,当把 horse 变为 rorse 之后,之后只要删除第二个r,跟最后一个e,就可以变为 ros。实际上只要三步就完成了,因为删除了某个字母后,原来左右不相连的字母现在就连一起了,有可能刚好组成了需要的字符串。所以在比较的时候,要尝试三种操作,因为谁也不知道当前的操作会对后面产生什么样的影响。对于当前比较的两个字符 word1[i] 和 word2[j],若二者相同,一切好说,直接跳到下一个位置。若不相同,有三种处理方法,首先是直接插入一个 word2[j],那么 word2[j] 位置的字符就跳过了,接着比较 word1[i] 和 word2[j+1] 即可。第二个种方法是删除,即将 word1[i] 字符直接删掉,接着比较 word1[i+1] 和 word2[j] 即可。第三种则是将 word1[i] 修改为 word2[j],接着比较 word1[i+1] 和 word[j+1] 即可。分析到这里,就可以直接写出递归的代码,但是很可惜会 Time Limited Exceed,所以必须要优化时间复杂度,需要去掉大量的重复计算,这里使用记忆数组 memo 来保存计算过的状态,从而可以通过 OJ,注意这里的 insertCnt,deleteCnt,replaceCnt 仅仅是表示当前对应的位置分别采用了插入,删除,和替换操作,整体返回的最小距离,后面位置的还是会调用递归返回最小的,参见代码如下:

解法一:

class Solution {public:    int minDistance(string word1, string word2) {        int m = word1.size(), n = word2.size();        vector<vector<int>> memo(m, vector<int>(n));        return helper(word1, 0, word2, 0, memo);    }    int helper(string& word1, int i, string& word2, int j, vector<vector<int>>& memo) {        if (i == word1.size()) return (int)word2.size() - j;        if (j == word2.size()) return (int)word1.size() - i;        if (memo[i][j] > 0) return memo[i][j];        int res = 0;        if (word1[i] == word2[j]) {            return helper(word1, i + 1, word2, j + 1, memo);        } else {            int insertCnt = helper(word1, i, word2, j + 1, memo);            int deleteCnt = helper(word1, i + 1, word2, j, memo);            int replaceCnt = helper(word1, i + 1, word2, j + 1, memo);            res = min(insertCnt, min(deleteCnt, replaceCnt)) + 1;        }        return memo[i][j] = res;    }};

根据以往的经验,对于字符串相关的题目且求极值的问题,十有八九都是用动态规划 Dynamic Programming 来解,这道题也不例外。其实解法一的递归加记忆数组的方法也可以看作是 DP 的递归写法。这里需要维护一个二维的数组 dp,其大小为 mxn,m和n分别为 word1 和 word2 的长度。dp[i][j] 表示从 word1 的前i个字符转换到 word2 的前j个字符所需要的步骤。先给这个二维数组 dp 的第一行第一列赋值,这个很简单,因为第一行和第一列对应的总有一个字符串是空串,于是转换步骤完全是另一个字符串的长度。跟以往的 DP 题目类似,难点还是在于找出状态转移方程,可以举个例子来看,比如 word1 是 "bbc",word2 是 "abcd",可以得到 dp 数组如下:

  Ø a b c d
Ø 0 1 2 3 4
b 1 1 1 2 3
b 2 2 1 2 3
c 3 3 2 1 2

通过观察可以发现,当 word1[i] == word2[j] 时,dp[i][j] = dp[i - 1][j - 1],其他情况时,dp[i][j] 是其左,左上,上的三个值中的最小值加1,其实这里的左,上,和左上,分别对应的增加,删除,修改操作,具体可以参见解法一种的讲解部分,那么可以得到状态转移方程为:

dp[i][j] =      /    dp[i - 1][j - 1]                                                                   if word1[i - 1] == word2[j - 1]

                      min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1            else

解法二:

class Solution {public:    int minDistance(string word1, string word2) {        int m = word1.size(), n = word2.size();        vector<vector<int>> dp(m + 1, vector<int>(n + 1));        for (int i = 0; i <= m; ++i) dp[i][0] = i;        for (int i = 0; i <= n; ++i) dp[0][i] = i;        for (int i = 1; i <= m; ++i) {            for (int j = 1; j <= n; ++j) {                if (word1[i - 1] == word2[j - 1]) {                    dp[i][j] = dp[i - 1][j - 1];                } else {                    dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;                }            }        }        return dp[m][n];    }};

关于“C++怎么编辑距离”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网其他教程频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: C++怎么编辑距离

本文链接: https://www.lsjlt.com/news/296231.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++怎么编辑距离
    这篇文章主要介绍“C++怎么编辑距离”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++怎么编辑距离”文章能帮助大家解决问题。编辑距离Example 1:Input: word1 = "h...
    99+
    2023-06-19
  • 怎么用C++实现编辑距离
    这篇文章主要讲解了“怎么用C++实现编辑距离”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用C++实现编辑距离”吧!Edit Distance 编辑距离Given two words&n...
    99+
    2023-06-20
  • C++编辑距离(动态规划)
    题目描述: 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 我们可以对一个单词进行如下三种操作: 插入一个字符删除一个...
    99+
    2024-04-02
  • C++实现LeetCode(72.编辑距离)
    [LeetCode] 72. Edit Distance 编辑距离 Given two words word1 and word2, find the ...
    99+
    2024-04-02
  • C++怎么判断编辑距离是否为1
    这篇文章主要讲解了“C++怎么判断编辑距离是否为1”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么判断编辑距离是否为1”吧!编辑距离这道题是之前那道 Edit Distan...
    99+
    2023-06-20
  • Python “编辑距离”(Levens
    本文搜集了网上比较常用的几种计算Levenshtein distance的函数, 其中函数(1)为调用数学工具包Numpy, 函数(2)和(1)算法类似,都是采用DP, (3)来自wiki(4)是直接调用python的第三方库Levens...
    99+
    2023-01-31
    距离 编辑 Python
  • C++实现LeetCode(161.一个编辑距离)
    [LeetCode] 161. One Edit Distance 一个编辑距离 Given two strings s and t, determin...
    99+
    2024-04-02
  • 算法leetcode|72. 编辑距离(rust重拳出击)
    文章目录 72. 编辑距离:样例 1:样例 2:提示: 分析:题解:rust:二维数组(易懂)滚动数组(更加优化的内存空间) go:c++:python:java: 72...
    99+
    2023-09-07
    rust golang 数据结构 算法 后端 leetcode
  • Java动态规划之如何编辑距离问题
    这篇文章给大家分享的是有关Java动态规划之如何编辑距离问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所...
    99+
    2023-05-30
    java
  • PHP如何计算两个字符串之间的编辑距离
    这篇文章将为大家详细讲解有关PHP如何计算两个字符串之间的编辑距离,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 计算字符串编辑距离 引言 字符串编辑距离是衡量两个字符串相似程度的指标。它计算将一个...
    99+
    2024-04-02
  • C#中怎么编辑注册表
    C#中怎么编辑注册表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Windows 操作系统的注册表包含了很多有关计算机运行的配置方式,打开注册表我们可以看到注册...
    99+
    2023-06-17
  • css怎么设置div之间距离
    本篇内容介绍了“css怎么设置div之间距离”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • PHP怎么计算汉明距离总和
    这篇文章主要介绍“PHP怎么计算汉明距离总和”,在日常操作中,相信很多人在PHP怎么计算汉明距离总和问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP怎么计算汉明距离总和”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • html段落之间的距离怎么调
    在 html 中,可以使用 css 属性 margin-bottom 和 margin-top 来调节段落之间的间距:margin-bottom 属性设置段落底部间距,语法:margin...
    99+
    2024-04-22
    css
  • python中scipy.spatial.distance距离计算函数怎么用
    这篇文章主要为大家展示了“python中scipy.spatial.distance距离计算函数怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中scipy.spatial.di...
    99+
    2023-06-29
  • python怎么求两个坐标点的距离
    可以使用Python中的math模块中的sqrt和pow函数来计算两个坐标点的距离。假设有两个坐标点A(x1, y1)和B(x2, ...
    99+
    2023-08-31
    python
  • 怎么编辑git
    在软件开发中,Git是一种被广泛采用的版本控制系统。通过使用Git,开发者可以在多个团队成员之间协同开发和维护代码,同时也能够记录代码的变化历史,方便回溯和管理。在使用Git时,我们经常需要进行一些编辑操作来处理版本控制的相关任务。本文将介...
    99+
    2023-10-22
  • 编辑InitializeComponent()方法 C#
    InitializeComponent()方法是一个自动生成的方法,在Windows Forms应用程序的窗体类中定义。这个方法用于...
    99+
    2023-09-26
    C#
  • css怎么设置段落之间的距离
    css设置段落之间距离的方法:1、使用“line-height”属性设置行高拉开段落之间的距离,只需要在css中添加“line-height:20px”样式代码,设置行高为20px拉开段落间距离;2、使用“padding”内边距属性实现段落...
    99+
    2024-04-02
  • python中怎么求两点之间的距离
    可以使用以下方法来求两点之间的距离: import math def distance(x1, y1, x2, y2): ...
    99+
    2024-03-15
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作