Edit Distance

思路

行代表一个字符串,列代一个字符串,设边界为s[0][i]=i;s[j][0]=j,代表从空字符串变成另一个字符串所需要的次数;
递推方程:
1、假设a[i]==b[j],即最后一位不用变化,那么s[i][j]=s[i-1][j-1];
2、假设a[i]!=b[j],那么有三种操作情况:
(1)将a[i]删除,s[i][j]=s[i-1][j]+1;
(2)将a[i]加入b[j],s[i][j]=s[i][j-1]+1;
(3)将a[i]换成b[j],s[i][j]=s[i-1][j-1]+1。 此题思路与最长公共子字符串类似,可参考那道题。

#include<iostream>
#include<cstring>
using namespace std;
int a[2001][2001];  //必须放外面,因为数组太大
int main(){
    char b[2001],c[2001];
    int i,j;
    cin>>b>>c;
    int len1=strlen(b);
    int len2=strlen(c);
    for(i=0;i<=len2;i++){
        a[0][i]=i;
    }
    for(i=0;i<=len1;i++){
        a[i][0]=i;
    }
    for(i=1;i<=len1;i++){    //行是字符串a
        for(j=1;j<=len2;j++){    //列是字符串b
            if(b[i-1]==c[j-1]){
                a[i][j]= a[i-1][j-1];
            }
            else{
                a[i][j]=min(a[i-1][j-1],min(a[i-1][j],a[i][j-1]))+1;
            }
        }
    }
    cout<<a[len1][len2]<<endl;
    return 0;
}

results matching ""

    No results matching ""