编辑距离

来源:互联网 发布:淘宝秒杀抢拍器怎么买 编辑:程序博客网 时间:2024/05/29 05:08

一、

状态转移方程还是比较难推出,这是DP问题的共性。没有更好的更好的办法,只能通过积累模型来提升判断能力。

二、

根据insert,delete,replace,三种情况分别写出递推式:

Insert: d[i][j] .= d[i-1][j]+1;

Delete: d[i][j] .= d[i][j-1] +1;

Replace: d[i][j] .= d[i-1[][j-1] + a[i]==b[j]?0:1;

d[i][j] = max(Insert,Delete,Replace)

三、

通过二维数组记录中间结果,并不能保证不超时。涉及到字符串的操作会导致复杂度上升为O(m*n*(m+n)),所以想办法避免字符串操作,例如substr(),通过参数方式规避substr操作是完全可以行的。

四、

实现类

class Solution {public:    int rMin(string &w1,string &w2,vector< vector<int> > &dis,int m,int n){if(!m) return n;    if(!n) return m;    if(dis[m-1][n-1]!=-1) return dis[m-1][n-1];int a,b,c;a=w1[m-1]==w2[n-1]?rMin(w1,w2,dis,m-1,n-1):(rMin(w1,w2,dis,m-1,n-1)+1);b=rMin(w1,w2,dis,m-1,n)+1;c=rMin(w1,w2,dis,m,n-1)+1;return dis[m-1][n-1]=min(min(a,b),c);}int minDistance(string word1, string word2) {     int m = word1.size();     int n = word2.size();     if(!m||!n) return max(m,n);          vector< vector<int> > dis(m,vector<int>(n,-1));     return rMin(word1,word2,dis,m,n);}};
五、

测试

#include <iostream>#include <string>#include <algorithm>#include <vector>using namespace std;int rMin(string &w1,string &w2,vector< vector<int> > &dis,int m,int n){if(!m) return n;    if(!n) return m;    if(dis[m-1][n-1]!=-1) return dis[m-1][n-1];int a,b,c;a=w1[m-1]==w2[n-1]?rMin(w1,w2,dis,m-1,n-1):(rMin(w1,w2,dis,m-1,n-1)+1);b=rMin(w1,w2,dis,m-1,n)+1;c=rMin(w1,w2,dis,m,n-1)+1;return dis[m-1][n-1]=min(min(a,b),c);}int minDistance(string word1, string word2) {     int m = word1.size();     int n = word2.size();     if(!m||!n) return max(m,n);          vector< vector<int> > dis(m,vector<int>(n,-1));     return rMin(word1,word2,dis,m,n);}int main() {// your code goes herestring w1,w2;cin>>w1>>w2;cout<<minDistance(w1,w2)<<endl;return 0;}



0 0
原创粉丝点击