题目
还是动态规划,学到这里算是有了一点感觉,这个题也算是整理一下课堂的学习吧~
编辑距离,也就是求两个字符串之间的最短距离,
应用实例如搜索引擎(提示你查找的是不是“xxxx”)、医学信息工程的基因问题研究等。
分析
字符串:x
[1...m] 和y[1...n]
E[i,j]表示x[1...i]到y[1...j]的编辑距离距离
if i = 0 E[i,j] = j
if j = 0 E[i,j] = I
if i>0且j>0,在以下三个操作中选取最小值的作为E[i,j]的值
① 插入操作 <= 即x的最后一个字符(x[i])和y的倒数第二个字符(y[j-1])相同,在x尾部插入y[j],即E[i,j] = E[i][j - 1]+1
② 删除操作 <= 即x的倒数第二个字符(x[i-1])和y的最后一个字符(y[j])相同,删去x[i],即E[i,j] = E[i- 1][j]+1
③ 替换操作 <= if x[i] = y[j],E[i,j]=0 ; 否则将x[i]替换成y[j],即E[i,j] = E[i - 1] -[j - 1]+1
整个过程相当于在填一个表格,E[m][n]就是所求.
实现
class Solution {
public:
int min(int a, int b, int c) {
int tmp = a < b ? a : b;
return tmp < c ? tmp : c;
}
int minDistance(string word1, string word2) {
int n1 = word1.length();
int n2 = word2.length();
if(n1 == 0) return n2;
if(n2 == 0) return n1;
int E[n1 + 1][n2 + 1] = {0};
for(int i = 0; i <= n1; i++) {
for(int j = 0; j <= n2; j++) {
if(i == 0)
E[i][j] = j;
else if(j == 0)
E[i][j] = i;
else if(i > 0 && j >0) {
int different = 1;
//注意这里word的下标,要比i,j小1才是要比较的字符
if(word1[i - 1] == word2[j - 1])
different = 0;
E[i][j] = min(E[i][j - 1] + 1, E[i - 1][j] + 1, E[i - 1][j - 1] + different);
}
}
}
return E[n1][n2];
}
};