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

计算字符串的编辑距离

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

这是一维的压缩情况,该篇仅在你搞懂二维的动态规划方可解锁,详见注释

#include <algorithm>
#include <vector>

using namespace std;

int main() {
    string str1,str2;
    while(cin>>str1>>str2){
        int m =str1.size();
        int n = str2.size();
        vector<int> dp(n+1,0);
       
        for(int i =0;i<n+1;i++){
            dp[i]=i;//这里初始化第一行很难理解,我们把dp里的二维给压缩成了一维
            //二维保存了很多信息,但其实我们只需要最后一行的信息。
        }
        
        int diffi,diffj,diffij;
        for(int i =1;i<m+1;i++){//这里开始第二行了,先把第二行第一列给赋值覆盖掉
            //第一行之前赋的值,准备更新第二行的值了,这个外层就负责更新每一行的第一列
            dp[0]=i;
            diffij = dp[0]-1;//这里其实就是求dp[i][0]的上面一个因为列数为0上面一个dp
            //值肯定要-1这个值后面的内层循环列的时候要更新
            
            for(int j =1;j<n+1;j++){
                diffj=dp[j];//如果想象成二维的话这里对应着i-1行的j列,就是以前的值我们 
                //我们要保留下来,因为后面列还要靠它来更新.//下面这里一定注意str1[i-1]
                //我这用两种方法每次都搞错这里,i-1才表示前i个字符
                dp[j]=min(dp[j]+1,min(dp[j-1]+1,((str1[i-1]==str2[j-1])?0:1)+diffij));
  //上面这行min里的dp[j-1]之前已经更新过了的,min里的dp[j]其实是i-1行的j列,也就是没有
  //覆盖掉的,等号左边就是即将更新的,他在这个内层循环的下一次又充当min里的dp[j-1]
                diffij = diffj;//这里更新左上角的值,就是内层循环第一句那里为什么要保留了
            }
        }
        cout<<dp[n]<<endl;//最后的dp[n]其实已经遍历m行了,只保留了最后一行
//这种方法空间复杂度就比较低
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 14:45
bg是二本双一流硕,目标是Java后端开发岗,投暑期实习0大厂面试,只有极少的大厂测开,可能投的晚加上简历太烂加上0实习?求大佬们给个建议
程序员小白条:别去小厂,初创或者外包,尽量去中小,100-499和500-999,专门做互联网产品的,有公司自研的平台和封装的工具等等,去学习一些业务相关的,比如抽奖,积分兑换,SSO认证,风控,零售等等,目标 Java 后端开发吗?你要不考虑直接走大厂测开?如果技术不行的话,有面试你也很难过的
实习,不懂就问
点赞 评论 收藏
分享
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务