美文网首页动态规划
最小编辑距离

最小编辑距离

作者: 留十夜 | 来源:发表于2017-05-02 15:11 被阅读0次

题目

给定一个源串S和目标串T,能够对源串进行如下操作:
1.在给定位置上插入一个字符
2.替换任意字符
3.删除任意字符
写一个程序,返回最小操作数,使得对源串进行这些操作后等于目标串。

举例

ab -->abc :1
ab -->ac :1
good -->god :1

小技巧

删除和插入都可以理解为添加一个占位符,比如:
S :ahi
T : _hi
即删除S中的a

S : _ello
T : hello
即在S中插入一个h

dp思路

dp[i][j] 表示S的前i个位置 和 T的前j个位置对齐的最少得分
那么就要寻找该状态的前一个状态 以导出递推关系

  1. dp[i-1][j-1] +same(i,j) 本轮对齐操作(比对)的位置就是S的 i 和 T的 j(认为i 和 j对齐),如果二者不同则same为1(替换操作发生)。 因此前一个状态是dp[i-1][j-1],i-1 和 j-1 对齐。

  2. dp[i-1][j] +1 删除S的 i ,相当于T中添加占位符与i对齐 本轮发生对齐操作的只有S 的 i,因此前一个状态是dp[i-1][j] 。删除S的 i也可以理解为此时只有S的 i是多余的,也就是S的前i-1 和 T 的前 j是对齐的。

  3. dp[i][j-1] +1 S中插入占位符与T 的 j对齐,插入操作。 本轮发生对齐操作的只有T 的 j,因此前一个状态是dp[i][j-1] 。也可以理解为此时只有T的 j是多余的,也就是S的前 i 和 T 的前 j-1是对齐的。
    综上:
    dp[i][j] = min(dp[i-1][j-1] +same(i,j),dp[i-1][j] +1,dp[i][j-1] +1)

初值:
Dp[0][j] = j S 是空的 T有几位 就插入几位
Dp[i][0] = i T 是空的 S有几位 就删除几位
时空复杂度:
依次填充二维矩阵嘛 O(m*n) ,m,n是各自长度

代码

int minDistance(string word1, string word2) { int m = word1.size(); int n = word2.size(); vector<vector<int>> dp(m+1,vector<int>(n+1));//开二维数组 注意加一 for(int i=0;i<=m;++i){ for(int j=0;j<=n;++j){ if(i==0){ dp[i][j] = j; } else if(j==0){ dp[i][j] = i; } else{ //dp数组中的下标k 对应于字符串word中的下标k-1 dp[i][j] = min(dp[i-1][j-1]+((word1[i-1]==word2[j-1])?0:1),min(dp[i][j-1]+1,dp[i-1][j]+1)); } } } return dp[m][n]; }
空间优化:节省一个维度
二维 变一维:
Dp[i][j-1] -> dp[j-1]
Dp[i-1][j] -> dp[j]

int minDistance(string word1, string word2) { int m = word1.size(); int n = word2.size(); vector<int> dp(n+1); for(int i=0;i<=m;++i){ int last; for(int j=0;j<=n;++j){ if(i==0){ dp[j] = j; } else if(j==0){ last = dp[j]; dp[j] = i; //dp[i][0] 因此last:dp[i-1][0] 当下一轮j变成1时使用该last } else{ int temp = dp[j]; //更新之后的dp[j]就是原来的dp[i][j] 未更新的dp[j]就是dp[i-1][j] dp[j-1]就是dp[i][j-1] //last 代替dp[i-1][j-1] 通过dp[j](原dp[i-1][j])延时一步得到 dp[j] = min(last+((word1[i-1]==word2[j-1])?0:1),min(dp[j-1]+1,dp[j]+1)); last = temp; } } } return dp[n]; }

相关文章

  • 最小编辑距离

    编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提...

  • 最小编辑距离

    题目 给定一个源串S和目标串T,能够对源串进行如下操作:1.在给定位置上插入一个字符2.替换任意字符3.删除任意字...

  • 最小编辑距离

    定义:两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同。许可的编辑操作包...

  • 最小编辑距离

    1.定义 假设只有三种编辑方式:插入,删除,替换。每种编辑方式对应一次操作。按规定的编辑方式,将原始字符串变换到目...

  • 最小编辑距离

    求两个字符串最小编辑距离,word1->word2转换 word1的前i个字符串要想转换为word2的前j个字符串...

  • 最小编辑距离

    最小编辑距离 编辑距离有两种: Levenshtein距离: 允许插入,删除和替换一个字符, 最常见 Damera...

  • NLP-2012斯坦福课程第3课 基本问题

    一、最小编辑距离编辑距离(Minimum Edit Distance,MED),又称Levenshtein距离,是...

  • 72、最小编辑距离

    我太小看面试难度了,本来以为这样的题目不会遇到,但是小米面试的时候遇到了,好在没做出来也过了,所以一定要搞懂啊。 ...

  • 最小编辑距离_Python

    最小编辑距离或莱文斯坦距离(Levenshtein),指由字符串A转化为字符串B的最小编辑次数。允许的编辑操作有:...

  • 最小编辑距离算法

    https://github.com/youngwind/blog/issues/106

网友评论

    本文标题:最小编辑距离

    本文链接:https://www.haomeiwen.com/subject/xvlctxtx.html