编辑距离是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
时间复杂度O(m*n),空间复杂度O(m*n)
class Solution {
public:
int minDistance(string word1, string word2) {
int m=word1.size();
int n=word2.size();
vector<vector<int>> dis(m+1);
for(int i=0;i<=m;i++)dis[i].assign(n+1,INT_MAX);
dis[0][0]=0;
for(int i=0;i<=m;i++)
for(int j=0;j<=n;j++){
if(i>0) dis[i][j] = min(dis[i][j],dis[i-1][j]+1); //delete
if(j>0) dis[i][j] = min(dis[i][j],dis[i][j-1]+1);//insert
//substitute
if(i>0&&j>0)
{
if(word1[i-1]!=word2[j-1])
dis[i][j] = min(dis[i][j],dis[i-1][j-1]+1);
else
dis[i][j] = min(dis[i][j],dis[i-1][j-1]);
}
}
return dis[m][n];
}
}; class Solution {
public:
int minDistance(string word1, string word2) {
int f[word2.length()+1];
int upper_left=0;//记录f[i-1][j-1];
for(size_t i=0;i<=word2.size();++i)
f[i]=i;
for(size_t i=1;i<=word1.size();++i){
upper_left=f[0];
f[0]=i;
for(size_t j=1;j<=word2.size();++j){
int upper=f[j];
if(word1[i-1]==word2[j-1])
f[j]=upper_left;
else
f[j]=1+min(upper_left,min(f[j],f[j-1])); //f[j-1]表示dp[i][j-1],f[j]表示dp[i][j]
upper_left=upper;
}
}
return f[word2.length()];
}
}; 还有一类问题也属于编辑距离问题,即用于DNA的比对问题:
问题描述:
DNA在复制的时候可能出现的偏差是(理论上,对每个碱基被复制时,都可能出现偏差):
1. 漏掉某个脱氧核苷酸。例如把 AGGT 复制成为:AGT
2. 错码,例如把 AGGT 复制成了:AGCT
3. 重码,例如把 AGGT 复制成了:AAGGT
如果某DNA串a,最少要经过 n 次出错,才能变为DNA串b,则称这两个DNA串的距离为 n。
例如:AGGTCATATTCC 与 CGGTCATATTC 的距离为 2
这其实也就是编辑距离的变形,代码同上
原文:http://blog.csdn.net/starcuan/article/details/18975895