zoukankan      html  css  js  c++  java
  • 72. Edit Distance (JAVA)

    Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2.

    You have the following 3 operations permitted on a word:

    1. Insert a character
    2. Delete a character
    3. Replace a character

    Example 1:

    Input: word1 = "horse", word2 = "ros"
    Output: 3
    Explanation: 
    horse -> rorse (replace 'h' with 'r')
    rorse -> rose (remove 'r')
    rose -> ros (remove 'e')
    

    Example 2:

    Input: word1 = "intention", word2 = "execution"
    Output: 5
    Explanation: 
    intention -> inention (remove 't')
    inention -> enention (replace 'i' with 'e')
    enention -> exention (replace 'n' with 'x')
    exention -> exection (replace 'n' with 'c')
    exection -> execution (insert 'u')
    
     

    使用递归会造成Time limit exceeded

    class Solution {
        public int minDistance(String word1, String word2) {
            StringBuffer strBuf1 = new StringBuffer(word1);
            StringBuffer strBuf2 = new StringBuffer(word2);
            
            return dfs(strBuf1,strBuf2,0,0,0);
        }
        
        public int insert(StringBuffer strBuf1, StringBuffer strBuf2, int i1, int i2, int depth){
            strBuf1.insert(i1, strBuf2.charAt(i2));
            int ret = dfs(strBuf1,strBuf2,i1+1, i2+1,depth+1);
            strBuf1.deleteCharAt(i1); //recover
            return ret;
        }
        
        public int delete(StringBuffer strBuf1, StringBuffer strBuf2, int i1, int i2, int depth){
            Character ch = strBuf1.charAt(i1);
            strBuf1.deleteCharAt(i1);
            int ret = dfs(strBuf1,strBuf2,i1, i2,depth+1);
            strBuf1.insert(i1,ch); //recover;
            return ret;
        }
        
        public int replace(StringBuffer strBuf1, StringBuffer strBuf2, int i1, int i2, int depth){
            Character ch = strBuf1.charAt(i1);
            strBuf1.setCharAt(i1, strBuf2.charAt(i2));
            int ret = dfs(strBuf1,strBuf2,i1+1, i2+1,depth+1);
            strBuf1.setCharAt(i1, ch);
            return ret;
        }
        
        private int dfs(StringBuffer strBuf1, StringBuffer strBuf2, int i1, int i2, int depth){
            while(i1 < strBuf1.length() && i2 < strBuf2.length() && strBuf1.charAt(i1) == strBuf2.charAt(i2)){
                i1++;
                i2++;
            }
            
            if(i1 == strBuf1.length() && i2 == strBuf2.length()) return depth;
            if(i1 == strBuf1.length()) return depth+strBuf2.length()-i2;
            if(i2 == strBuf2.length()) return depth+strBuf1.length()-i1;
    
            int ret = insert(strBuf1,strBuf2,i1,i2,depth);
            ret = Math.min(ret,delete(strBuf1,strBuf2,i1,i2,depth));
            ret = Math.min(ret,replace(strBuf1,strBuf2,i1,i2,depth));
    
            return ret;
            
        }
        
    }

     使用动态规划dp[i][j]表示从word1[i+1]位置到word2[j+1]位置 需要改变次数。

    class Solution {
        public int minDistance(String word1, String word2) {
            int[][] dp = new int[word1.length()+1][word2.length()+1];
            for(int i = 0; i <= word1.length(); i++){
                dp[i][0] = i;
            }
            for(int j = 0; j <= word2.length(); j++){
                dp[0][j] = j;
            }
            for(int i = 1; i <= word1.length(); i++){
                for(int j = 1; j <= word2.length(); j++){
                    if(word1.charAt(i-1) == word2.charAt(j-1)){
                        dp[i][j] = dp[i-1][j-1];
                    }
                    else{
                        dp[i][j] = 1+Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1])); //insert & replace: dp[i-1][j-1] +1; delete: dp[i-1][j],dp[i][j-1]
                    }
                }
            }
    
            return dp[word1.length()][word2.length()];
        }
        
    }
  • 相关阅读:
    什么是递归神经网络
    2020年蜂窝网络连接超过110亿台设备
    伊朗Cisco路由器遭黑客攻击 全国互联网几乎瘫痪
    看了才知道!伊朗黑客组织原来这么牛
    美国知名Cloudflare网络公司遭中国顶尖黑客攻击
    如何对Web服务器进行飓风级防御
    美国的科技公司是如何使用加密的DNS
    揭秘网络黑客常见的6种必用攻击手段
    物联网是什么?您的家用电器从黑客手中安全吗
    不可不知!设置什么密码才不易被黑客破解
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/10913547.html
Copyright © 2011-2022 走看看