zoukankan      html  css  js  c++  java
  • 刷题72. Edit Distance

    一、题目说明

    题目72. Edit Distance,计算将word1转换为word2最少需要的操作。操作包含:插入一个字符,删除一个字符,替换一个字符。本题难度为Hard!

    二、我的解答

    这个题目一点思路也没,就直接看答案了。用的还是dp算法,dp[n1+1][n2+1]中的dp[i][j]表示将word1的前i位,变为word2的前j位需要的步骤。注意第1行是空,第1列也是空。

    1.第一行中,dp[0][i]表示空字符""到word2[0,...,i]需要编辑几次

    2.第一列中,dp[i][0]表示空字符到word2[0,...,i]需要编辑几次

    3.循环计算dp的值

    if(word1[i]==word2[j]){
        dp[i][j] == dp[i-1][j-1]
    }else{
        dp[i][j]=min(dp[i−1][j−1],dp[i][j−1],dp[i−1][j])+1
    }
    

    有了方法,实现不难:

    class Solution{
    	public:
    		int minDistance(string word1,string word2){
    			int n1 = word1.size(),n2= word2.size();
    			if(n1<=0) return n2;
    			if(n2<=0) return n1;
    			vector<vector<int>> dp(n1+1,vector<int>(n2+1,0)); 
    			//初始化第1行 
    			for(int i=0;i<=n2;i++){
    				dp[0][i] = i;
    			}
    			
    			//初始化第1列 
    			for(int i=0;i<=n1;i++){
    				dp[i][0] = i;
    			}
    			
    			//计算dp矩阵
    //			if(word1[i]==word2[j]){
    //			    dp[i][j] == dp[i-1][j-1]
    //			}else{
    //			    dp[i][j]=min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j])+1
    //			} 
    			for(int i=1;i<=n1;i++){//行 
    				for(int j=1;j<=n2;j++){//列 
    					if(word1[i-1]==word2[j-1]) {
    						dp[i][j] = dp[i-1][j-1];
    					}else{
    						dp[i][j] = min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
    					}
    				} 
    			}
    			return dp[n1][n2];
    		}
    };
    

    性能如下:

    Runtime: 16 ms, faster than 40.38% of C++ online submissions for Edit Distance.
    Memory Usage: 11.3 MB, less than 62.50% of C++ online submissions for Edit Distance.
    

    三、优化措施

    今天做这么多吧,有点晕了。明天继续!

    再回头看看题目Edit Distance,我好像以前做过,不过忘记了。

    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    嵌入式软件设计第12次实验报告
    嵌入式软件设计第11次实验报告
    嵌入式第十次实验报告
    嵌入式第九次实验报告
    作业二:个人博客作业内容:需求分析
    嵌入式软件设计第8次实验报告
    嵌入式软件设计第7次实验报告
    自我介绍
    实习总结(第四周)
    个人博客作业三:微软小娜APP的案例分析
  • 原文地址:https://www.cnblogs.com/siweihz/p/12249622.html
Copyright © 2011-2022 走看看