Edit Distance
来源:互联网 发布:男士服装杂志软件 编辑:程序博客网 时间:2024/06/05 20:46
Given two words word1 and word2, find the minimum numberof steps required to convert word1 to word2. (each operation is counted as 1step.)
You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character
也就是说,就是将一个字符串变成另外一个字符串所用的最少操作数,每次只能增加、删除或者替换一个字符。
首先我们令word1和word2分别为:michaelab和michaelxy(为了理解简单,我们假设word1和word2字符长度是一样的),dis[i][j]作为word1和word2之间的Edit Distance,我们要做的就是求出michaelx到michaely的最小steps。
首先解释下dis[i][j]:它是指word1[i]和word2[j]的Edit Distance。dis[0][0]表示word1和word2都为空的时候,此时他们的Edit Distance为0。很明显可以得出的,dis[0][j]就是word1为空,word2长度为j的情况,此时他们的Edit Distance为j,也就是从空,添加j个字符转换成word2的最小Edit Distance为j;同理dis[i][0]就是,word1长度为i,word2为空时,word1需要删除i个字符才能转换成空,所以转换成word2的最小Edit Distance为i。下面及时初始化代码:
vector<vector<int>> dis(row, vector<int>(col));
for (int i= 0; i< row; i++) dis[i][0]= i;
for (int j= 0; j< col; j++) dis[0][j]= j;
下面来分析下题目规定的三个操作:添加,删除,替换。
假设word1[i]和word2[j](此处i = j)分别为:michaelab和michaelxy
显然如果b==y, 那么dis[i][j] = dis[i-1][j-1]。
如果b!=y,那么:
添加:也就是在michaelab后面添加一个y,那么word1就变成了michaelaby,此时
dis[i][j] = 1 + dis[i][j-1];
上式中,1代表刚刚的添加操作,添加操作后,word1变成michaelaby,word2为michaelxy。dis[i][j-1]代表从word[i]转换成word[j-1]的最小Edit Distance,也就是michaelab转换成michaelx的最小Edit Distance,由于两个字符串尾部的y==y,所以只需要将michaelab变成michaelx就可以了,而他们之间的最小Edit Distance就是dis[i][j-1]。
删除:也就是将michaelab后面的b删除,那么word1就变成了michaela,此时
dis[i][j] = 1 + dis[i-1][j];
上式中,1代表刚刚的删除操作,删除操作后,word1变成michaela,word2为michaelxy。dis[i-1][j]代表从word[i-1]转换成word[j]的最小Edit Distance,也就是michaela转换成michaelxy的最小Edit Distance,所以只需要将michaela变成michaelxy就可以了,而他们之间的最小Edit Distance就是dis[i-1][j]。
替换:也就是将michaelab后面的b替换成y,那么word1就变成了michaelay,此时
dis[i][j] = 1 + dis[i-1][j-1];
上式中,1代表刚刚的替换操作,替换操作后,word1变成michaelay,word2为michaelxy。dis[i-1][j-1]代表从word[i-1]转换成word[j-1]的最小Edit Distance,也即是michaelay转换成michaelxy的最小Edit Distance,由于两个字符串尾部的y==y,所以只需要将michaela变成michaelx就可以了,而他们之间的最小Edit Distance就是dis[i-1][j-1]。
最后只需要看着三种方案哪种最小,就采用哪种的编辑方案。
源代码:
class Solution{
public:
int minDistance(string word1,string word2){
int len1 = word1.length()+ 1;
int len2 = word2.length()+ 1;
vector < vector <int> > dis(len1, vector<int>(len2));
//int distance[len1][len2];
for (int i = 0; i < len1; i ++)
{
dis[i][0]= i;
}
for (int j= 0; j< len2; j ++)
{
dis[0][j]= j;
}
for (int i= 1; i< len1; i ++)
{
for (int j= 1; j< len2; j ++)
{
if (word1[i- 1]== word2[j - 1])
{
dis[i][j]= dis[i - 1][j- 1];
}
else
{
dis[i][j]= min(dis[i- 1][j- 1]+ 1, min(dis[i][j-1]+ 1, dis[i-1][j]+ 1));
}
}
}
return dis[len1- 1][len2- 1];
}
};
- edit distance
- Edit Distance
- edit distance
- Edit Distance
- Edit Distance
- Edit Distance
- Edit Distance
- Edit Distance
- Edit Distance
- Edit Distance
- Edit Distance
- Edit Distance
- Edit Distance
- Edit Distance
- Edit Distance
- Edit Distance
- Edit Distance
- Edit Distance
- 编程与修行
- Two Sum
- 计算跑步时的热量消耗
- JS 面向对象
- TCP/IP 网络子系统 在Linux 内核中实现详解 (基于2.6.35版)
- Edit Distance
- 一道有趣奥数题——“丢番图的墓志铭”
- 一些小知识
- solr与zookeeper搭建solrcloud分布式索引服务实例-第一篇
- (java开源框架)使用Google Guava来编写优雅的代码一Guava简介
- 一个操盘手的自白:做盘的奥秘
- 《深入浅出struts2》--第二十七章,ajax之autocompleter标签
- 寒風的Cocos2dx之旅之一些游戏在控制方向的技巧
- Leetcode: Implement Stack using Queues