展开

关键词

Sweet Snippet 之 字符串编辑距离

本文链接:https://blog.csdn.net/tkokof1/article/details/100709721 字符串编辑距离的简单实现 字符串编辑距离应该是动态规划中的代表问题了: 给定两个字符串 aaa 与 bbb,求解将 aaa 编辑至 bbb 的操作步数(距离),编辑包含以下两种操作: 删除某一字符 增加某一字符 (这里我们不允许变更某一字符,注意一下) 求解方法则是根据子问题的结果 "递推"出原问题的结果: 设字符串 aaa 的长度为 mmm, 字符串 bbb 的长度为 nnn, 我们定义问题 C(i,j)C(i, j)C(i,j) C(i,j)C(i, j)C(i,j) : aaa 的(前缀)子串(长度为 iii) 与 bbb 的(前缀)子串(长度为 jjj) 的字符串编辑距离. local edit_dist_buffer = {} return edit_dist_recur(a, b, #a, #b, edit_dist_buffer) end 另外还看到一种基于编辑

25730

编辑距离

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

17220
  • 广告
    关闭

    老用户专属续费福利

    云服务器CVM、轻量应用服务器1.5折续费券等您来抽!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    编辑距离

    https://blog.csdn.net/ghsau/article/details/78903076 定义 编辑距离又称Leveinshtein距离,是由俄罗斯科学家 编辑距离是计算两个文本相似度的算法之一,以字符串为例,字符串a和字符串b的编辑距离是将a转换成b的最小操作次数,这里的操作包括三种: 插入一个字符 删除一个字符 替换一个字符 举个例子,kitten和sitting 的编辑距离是3,kitten -> sitten(k替换为s) -> sittin(e替换为i) -> sitting(插入g),至少要做3次操作。 ),一个字符串的长度为0,编辑距离自然是另一个字符串的长度当min(i,j)=0时,lev_{a,b}(i,j)=max(i,j),一个字符串的长度为0,编辑距离自然是另一个字符串的长度 当ai=bj时 ; } leftTop = nextLeftTop; } } return d[d.length - 1]; } 应用 编辑距离是基于文本自身去计算

    32530

    理解编辑距离

    顾名思义,编辑距离(Edit distance)是一种距离,用于衡量两个字符串之间的远近程度,方式是一个字符串至少需要多少次基础变换才能变成另一个字符串,可应用在拼写检查、判断 DNA 相似度等场景中。 根据可操作的基础变换不同,可分为以下几种: 莱文斯坦距离(Levenshtein distance):最常见的编辑距离,基础变换包括插入、删除和替换。 但是需要注意一点的是,当每种变换发生时,产生的距离(或者称为代价)并不一定是 1,例如斯坦福大学关于最小编辑距离的课件中,一次替换产生的距离就可能是 2。 汉明距离:基础变换只包括替换,所以只能应用于两个字符串长度相等的情况。 本文只讨论最常见的第一种形式,莱文斯坦距离。 解法 解法有两种:暴力法和动态规划法。 Weighted Edit Distance,即加权编辑距离,这其实是在初始化和后续计算时加入了一些权重作为先验,一步操作产生的距离不再是 1 或者 2。 其他变种…… 这些等有时间再说吧。

    43630

    8.动态规划(1)——字符串编辑距离

    编辑距离(Edit Distance),在本文指的是Levenshtein距离,也就是字符串S1通过插入、修改、删除三种操作最少能变换成字符串S2的次数。 例如:S1 = abc,S2 = abf,编辑距离d = 1(只需将c修改为f)。在本文中将利用动态规划的算法思想对字符串编辑距离求解。    可以看出红色方块即是最终所求的编辑距离,整个求解过程就是填满这个表——二维数组。下面是Java、Python分别对字符串编辑距离的动态规划求解。 len(s1) #s1字符串长度 23 n = len(s2) #s2字符串长度 24 if m == 0: 25 return n #s1字符串长度为0,此时的编辑距离就是 s2字符串长度 26 if n == 0: 27 return m #s2字符串长度为0,此时的编辑距离就是s1字符串长度 28 solutionMatrix =

    1.3K100

    编辑距离

    中的字符进行操作: 1对于插入字符的操作: 在 word1[m]word1[m] 的后面插入字符 word2[n]word2[n],需要一次编辑 dp[i][j] = dp[i][j - 1] + 1; 2对于删除字符的操作: 将 word1[m]word1[m] 删除,需要一次编辑 //dp[i][j] 代表 word1的前i个字符和 word2的前j个字符相等,需要操作的次数 for(int i=0;i<=m;i++){ //只有第一个字符串有值 第一串就删除 有多少删除多少 dp[i][0]=i; } for(int i=0;i<=n;i++){ //只有第2个字符串有值

    20650

    Python “编辑距离”(Levens

    其中函数(1)为调用数学工具包Numpy, 函数(2)和(1)算法类似,都是采用DP, (3)来自wiki(4)是直接调用python的第三方库Levensht...

    45910

    Edit Distance编辑距离

    题目大意 求两个字符串之间的最短编辑距离,即原来的字符串至少要经过多少次操作才能够变成目标字符串,操作包括删除一个字符、插入一个字符、更新一个字符。 解题思路 动态规划,经典题目。 DP[i][0] = i: word2为空,要从word1转化到空字符串,需要删除i个字符。 ?

    59130

    编辑距离

    ---- 编辑距离题解集合 动态规划 动态规划的优化---优化为一维数组 ---- 动态规划 解题思路: 定义数组元素含义 dp[i][j] 代表 word1 到 i 位置转换成 word2 到 这个还是非常容易计算的,因为当有一个字符串的长度为0时,转化为另外一个字符串,那么就只需要一直进行插入或者删除操作即可。 dp.size(); ++i) { for (int j = 1; j < dp[0].size(); ++j) { //这里i-1和j-1表示从第一个字符开始进行比较,因为字符串里面的第一个字符下标为 (int j = 1; j <= word2.size(); ++j) { int pre = temp;//保存dp(i-1,j-1) temp = dp[j]; //字符串字符下标从

    8530

    基于编辑距离相似度

    本节介绍 基于编辑距离相似度。 算法描述:一个句子转换为另一个句子需要的编辑次数,编辑包括删除、替换、添加,然后使用最长句子的长度归一化得相似度。

    40610

    序列比对(25)编辑距离

    本文介绍两个字符串编辑距离并给出代码。 编辑距离 ? 编辑距离的求解过程和全局比对是十分相似的(关于全局比对,可以参见前文《序列比对(一)全局比对Needleman-Wunsch算法》),都需要全部符号参与比对,都允许插入、缺失和错配。 所以,编辑距离可以用动态规划算法求解,其迭代公式是: ? 效果如下: ? 编辑距离与最长公共子序列 在只允许插入和缺失而不允许错配的情况下,两个字符串编辑距离可以通过最长公共子序列的长度(关于最长公共子序列,可以参看前文《序列比对(24)最长公共子序列》)间接算出来。 解编辑距离的代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSEQ 1000 #define GAP_CHAR

    34110

    编辑距离 (Levenshtein Distance算法)

    编辑距离是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数。 一般来说,两个字符串编辑距离越小,则它们越相似。如果两个字符串相等,则它们的编辑距离(为了方便,本文后续出现的“距离”,如果没有特别说明,则默认为“编辑距离”)为0(不需要任何操作)。 不难分析出,两个字符串编辑距离肯定不超过它们的最大长度(可以通过先把短串的每一位都修改成长串对应位置的字符,然后插入长串中的剩下字符)。 形式化定义 ? ? 问题描述 给定两个字符串A和B,求字符串A至少经过多少步字符操作变成字符串B。 问题解决 当其中某个字符串长度为0的时候,编辑距离就是另一个字符串的长度. 那么A[0] = B[0];的时候, 那么此时编辑距离依旧是0, 我们可以直接去除字符串的第一个字符了.

    1.1K10

    LeetCode-72-编辑距离

    # LeetCode-72-编辑距离 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 'n' 替换为 'x') exention -> exection (将 'n' 替换为 'c') exection -> execution (插入 'u') # 解题思路 方法1、动态规划: 编辑距离是大厂面试的常考题目

    5510

    编辑距离

    给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。

    16710

    经动态规划:编辑距离

    编辑距离可以衡量两个 DNA 序列的相似度,编辑距离越小,说明这两段 DNA 越相似,说不定这俩 DNA 的主人是远古近亲啥的。 下面言归正传,详细讲解一下编辑距离该怎么算,相信本文会让你有收获。 一、思路 编辑距离问题就是给我们两个字符串s1和s2,只能用三种操作,让我们把s1变成s2,求最少的操作数。 设两个字符串分别为 "rad" 和 "apple",为了把s1变成s2,算法会这样进行: 请记住这个 GIF 过程,这样就能算出编辑距离。关键在于如何做出正确的操作,稍后会讲。 为什么呢,因为易于找出状态转移的关系,比如编辑距离的 DP table: 还有一个细节,既然每个dp[i][j]只和它附近的三个状态有关,空间复杂度是可以压缩成 O(min(M,N)) 的(M,N 是两个字符串的长度 你可能还会问,这里只求出了最小的编辑距离,那具体的操作是什么?之前举的修改公众号文章的例子,只有一个最小编辑距离肯定不够,还得知道具体怎么修改才行。

    9120

    编辑距离

    ') exention -> exection (将 'n' 替换为 'c') exection -> execution (插入 'u') 解题思路 定义 dpi 为 w10:i 和 w20:j 的编辑距离 ,则分为两种情况: w1i == w2j,则这个字符不用编辑,dpi = dpi-1 w1i !

    11720

    算法:编辑距离(Levenshtein Distance)

    什么是“编辑距离” ? “编辑距离”又称 Leveinshtein 距离,是由俄罗斯科学家 Vladimir Levenshtein 在 1965 年提出。 “编辑距离”是计算两个文本相似度的算法之一,字符串 X 和字符串 Y 的编辑距离是将 X 转换成 Y 的最小操作次数,这里的操作包括三种: 插入一个字符 删除一个字符 替换一个字符 例如: kitten 和 sitting 的编辑距离是3。

    1K10

    P2758「编辑距离

    题目 题目链接:P2758「编辑距离」 。 题目描述 设 和 是两个字符串。我们要用最少的字符操作次数,将字符串 转换为字符串 。 输入格式 第一行为字符串 ;第二行为字符串字符串 和 的长度均小于 。 输出格式 只有一个正整数,为最少字符操作次数。 题解 分析 易知编辑距离是对称的,即将字符串 变成字符串 和将字符串 变成字符串 所需的最小操作数是一样的,也就是字符串 、 之间的编辑距离。 然后直觉感觉就是一道简单的 dp 题: 假设 表示字符串 和 之间的编辑距离,则有如下转移方程: 如果 ,则 。 如果 ,则 。 边界条件为: 。

    7940

    LeetCode 编辑距离 II(DP)

    编辑距离(DP) 注意不能插入字符 class Solution { public: int edit_distance(string s, string t) { int n1 dp[i][j] = dp[i-1][j-1]+1;//替换s或t的字符 if(i-1 >= j)//因为不能插入字符,删除 s 的 i 字符,前提是 s 字符串长度不能短于 dp[i][j] = min(dp[i][j], dp[i-1][j]+1); if(j-1 >= i)//因为不能插入字符,删除 t 的 j 字符,前提是 t 字符串长度不能短于

    13440

    编辑距离(DP)

    解题 参考我的博客:编辑距离 类似题目: LeetCode 583. 两个字符串的删除操作(动态规划) LeetCode 712. 两个字符串的最小ASCII删除和(DP,类似编辑距离) LeetCode 1143.

    24320

    相关产品

    • 智能编辑

      智能编辑

      腾讯云视频AI智能编辑提供无需人工,即可快速生成智能集锦(类型包括王者荣耀、英雄联盟、足球、篮球、花样滑冰等集锦)的服务,并且支持新闻拆条、广告拆条、人脸拆条服务,同时可生成视频的分类标签、视频标签,辅助视频推荐,AI识别片头片尾大大提升了短视频内容制作的便捷性,为短视频生产和智能融媒体编辑记者提升工作效率。

    相关资讯

    热门标签

    扫码关注腾讯云开发者

    领取腾讯云代金券