Leetcode题集——edit-distance
2016-08-07 17:08
295 查看
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)
You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character
动态规划法:
给定两个字符串A和B,由A转成B所需的最少编辑操作次数。允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将A(kitten)转成B(sitting):
sitten (k→s)替换
sittin (e→i)替换
sitting (→g)插入
思路:
如果我们用 i 表示当前字符串 A 的下标,j 表示当前字符串 B 的下标。 如果我们用d[i, j] 来表示A[1, ... , i] B[1, ... , j] 之间的最少编辑操作数。那么我们会有以下发现:
1. d[0, j] = j;
2. d[i, 0] = i;
3. d[i, j] = d[i-1, j - 1] if A[i] == B[j]
4. d[i, j] = min(d[i-1, j - 1], d[i, j - 1], d[i-1, j]) + 1 if A[i] != B[j]
所以,要找出最小编辑操作数,只需要从底自上判断就可以了。代码如下:
注意:二维数组内存申请及释放方式!!!
You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character
动态规划法:
给定两个字符串A和B,由A转成B所需的最少编辑操作次数。允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将A(kitten)转成B(sitting):
sitten (k→s)替换
sittin (e→i)替换
sitting (→g)插入
思路:
如果我们用 i 表示当前字符串 A 的下标,j 表示当前字符串 B 的下标。 如果我们用d[i, j] 来表示A[1, ... , i] B[1, ... , j] 之间的最少编辑操作数。那么我们会有以下发现:
1. d[0, j] = j;
2. d[i, 0] = i;
3. d[i, j] = d[i-1, j - 1] if A[i] == B[j]
4. d[i, j] = min(d[i-1, j - 1], d[i, j - 1], d[i-1, j]) + 1 if A[i] != B[j]
所以,要找出最小编辑操作数,只需要从底自上判断就可以了。代码如下:
注意:二维数组内存申请及释放方式!!!
int minDistance(string word1, string word2) { int n1=word1.size(); int n2=word2.size(); if(n1==0) return n2; if(n2==0) return n1; //动态分配二维数组,n1+1个一维数组 int **a; a=new int*[n1+1]; //为每一个一维数组申请内存n2+1 for(int i=0;i<=n1;i++) a[i]=new int[n2+1]; //数组初始化为-1 for(int i=0;i<=n1;i++) { for(int j=0;j<=n2;j++) a[i][j]=-1; } //初始化数组的第1行和第1列 for(int i=0;i<=n1;i++) a[i][0]=i; for(int j=0;j<=n2;j++) a[0][j]=j; for(int i=1;i<=n1;i++) { for(int j=1;j<=n2;j++) { if(word1[i-1]==word2[j-1]) a[i][j]=a[i-1][j-1]; else { int min=a[i-1][j]<a[i-1][j-1]?a[i-1][j]:a[i-1][j-1]; min=min<a[i][j-1]?min:a[i][j-1]; a[i][j]=min+1; } } } int tmp=a[n1][n2]; //先释放一维空间内存 for(int i=0;i<=n1;i++) { delete []a[i]; a[i]=NULL;//不要忘了置空 } //再释放二维空间内存 delete []a; a=NULL; return tmp; }
相关文章推荐
- 008——struts2的值栈
- POJ 2653 Pick-up sticks
- BDD测试利器:mocha+should.js
- 找出数组中两数之和为指定值的所有整数对
- Fragment全解析系列
- HDU 3727 Jewel 主席树
- java中代码块的执行顺序--静态代码块,构造器,普通代码块,构造块,main主函数
- 外观模式(Facade)
- 使用python修改QQ密保(脚本)
- Hive函数2.0
- $.post和String转流时引起乱码及解决办法
- QT 4.7.2的一个bug:QGLWidget::grabFrameBuffer() ignores withAlpha parameter
- xml基础知识
- liunx 下mysql 的安装
- 单例模式解析
- CentOS安装后ifconfig 无法显示网卡
- MacDown笔记(1)
- EF6 中tracking log使用方法总结
- 状态压缩dp小结
- 浅谈HTTP Adaptive Streaming技术及其前景