题解 | #计算字符串的编辑距离#

计算字符串的编辑距离

https://www.nowcoder.com/practice/3959837097c7413a961a135d7104c314

//不会做,题解看力扣学的,变态
//dp[i][j]表示str1的前i个和str2的前j个的编辑距离(0表示前0个字符,即空串)
//需要找公式,操作包括3种1增 2删 3环。对str2操作相当str1的逆反操作,那我们干脆只改str1

//(1)若str1[i]==str2[j],即最后字符相同,那么dp[i][j]=dp[i-1][j-1](str1[i]==str2[j])

//第0行、列即空串对比,等于下标。

//(2)否则,有以下几种操作尝试

//1    增,s1+=s2[j],操作一次使其等于情况(1),即dp[i][j-1]+1
//2    删,s1删除1个,dp[i-1][j]+1
//3    换,使得s1[i]==s2[j],dp[i-1][j-1]+1

//则dp[i][j]=min(dp[i][j-1],dp[i-1][j],dp[i-1][j-1])+1(str1[i]!=str2[j])



a b c d e f

0 1 2 3 4 5 6
a 1 0 1 2 3 4 5
b 2 1 0 1 2 3 4
c 3 2 1 0 1 2 3
d 4 3 2 1 0 1 2
e 5 4 3 2 1 0 1
f 6 5 4 3 2 1 0
g 7 6 5 4 3 2 1

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
int main(){
    string s1,s2;
    cin>>s1>>s2;
    int l1=s1.size(),l2=s2.size();
    int **dp=new int*[l1+1];
    for(int i=0;i<=l1;i++){
        dp[i]=new int[l2+1]{i};    //第0行、列即空串对比,初始第0列==下标
    }
    for(int i=0;i<=l2;i++){
        dp[0][i]=i;    //初始第0行==下标
    }
    for(int i=1;i<=l1;i++){
        for(int j=1;j<=l2;j++){
            if(s1[i-1]==s2[j-1]){
                dp[i][j]=dp[i-1][j-1];    //最后字符相同
            }else{
                //(2)否则,有以下几种操作尝试
                //1    增,s1+=s2[j],操作一次使其等于情况(1),即dp[i][j-1]+1
                //2    删,s1删除1个,dp[i-1][j]+1
                //3    换,使得s1[i]==s2[j],dp[i-1][j-1]+1
                dp[i][j]=min(dp[i][j-1],min(dp[i-1][j],dp[i-1][j-1]))+1;
            }
        }    
    }
    cout<<dp[l1][l2];
    return 0;
}


#华为笔试#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务