zoukankan      html  css  js  c++  java
  • 0072编辑距离 Marathon

    给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

    你可以对一个单词进行如下三种操作:

    插入一个字符
    删除一个字符
    替换一个字符

    示例 1:

    输入:word1 = "horse", word2 = "ros"
    输出:3
    解释:
    horse -> rorse (将 'h' 替换为 'r')
    rorse -> rose (删除 'r')
    rose -> ros (删除 'e')
    示例 2:

    输入:word1 = "intention", word2 = "execution"
    输出:5
    解释:
    intention -> inention (删除 't')
    inention -> enention (将 'i' 替换为 'e')
    enention -> exention (将 'n' 替换为 'x')
    exention -> exection (将 'n' 替换为 'c')
    exection -> execution (插入 'u')

    提示:

    0 <= word1.length, word2.length <= 500
    word1 和 word2 由小写英文字母组成

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/edit-distance

    参考:

    python

    # 0072.编辑距离
    
    class Solution:
        def minDistance(self, word1: str, word2: str) -> int:
            """
            动态规划,编辑距离
            1.dp定义
            - dp[i][j] 表示以下标i-1为结尾的字符串word1,
                和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]
            2.递推公式
            - if (word1[i - 1] == word2[j - 1])
                - 不操作
            - if (word1[i - 1] != word2[j - 1]) -> 增删改
                - 操作一:word1删除一个元素,那么就是以下标i - 2为结尾的word1 与 j-1为结尾的word2的最近编辑距离 再加上一个操作。
                    即 dp[i][j] = dp[i - 1][j] + 1
                - 操作二:word2删除一个元素,那么就是以下标i - 1为结尾的word1 与 j-2为结尾的word2的最近编辑距离 再加上一个操作。
                    即 dp[i][j] = dp[i][j - 1] + 1
                word2添加元素,即相当于word1删除元素
                - 操作三:替换元素,word1替换word1[i - 1],使其与word2[j - 1]相同,此时不用增加元素,那么以下标i-2为结尾的word1 与 j-2为结尾的word2的最近编辑距离 加上一个替换元素的操作。
                    即 dp[i][j] = dp[i - 1][j - 1] + 1;
    
                综上,当 if (word1[i - 1] != word2[j - 1]) 时取最小的,即:
                dp[i][j] = min({dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) + 1
            3.初始化
            - dp[i][0] = i
            - dp[0][j] = j
            :param word1:
            :param word2:
            :return:
            """
            dp = [[0] * (len(word2)+1) for _ in range(len(word1)+1)]
            for i in range(len(word1)+1):
                dp[i][0] = i
            for j in range(len(word2)+1):
                dp[0][j] = j
            for i in range(1, len(word1)+1):
                for j in range(1, len(word2)+1):
                    if word1[i-1] == word2[j-1]:
                        dp[i][j] = dp[i-1][j-1]
                    else:
                        dp[i][j] = min(dp[i-1][j-1]+1, dp[i][j-1]+1, dp[i-1][j-1]+1)
            return dp[-1][-1]
    

    golang

    package dynamicPrograming
    
    // 动态规划
    func minDistance2(word1, word2 string) int {
    	m,n := len(word1), len(word2)
    	dp := make([][]int, m+1)
    	for i := range dp {
    		dp[i] = make([]int, n+1)
    	}
    	for i:=0;i<=m;i++ {
    		dp[i][0] = i
    	}
    	for j:=0;j<=n;j++ {
    		dp[0][j] = j
    	}
    	for i:=1;i<=m;i++ {
    		for j:=1;j<=n;j++ {
    			if word1[i-1] == word2[j-1] {
    				dp[i][j] = dp[i-1][j-1]
    			} else { // min(替换,删除,添加)
    				dp[i][j] = min(dp[i-1][j-1]+1, dp[i-1][j]+1, dp[i][j-1]+1)
    			}
    		}
    	}
    	return dp[m][n]
    }
    
    func min(args...int) (min int) {
    	min := args[0]
    	for _, item := range args {
    		if item < min {
    			min = item
    		}
    	}
    	return min
    }
    
  • 相关阅读:
    Powershell数据处理
    Powershell About Active Directory Group Membership of a domain user
    Powershell About Active Directory Server
    Oracle Schema Objects——Tables——TableStorage
    Oracle Schema Objects——Tables——TableType
    English Grammar
    Oracle Database Documentation
    Oracle Schema Objects——Tables——Oracle Data Types
    Oracle Schema Objects——Tables——Overview of Tables
    What is Grammar?
  • 原文地址:https://www.cnblogs.com/davis12/p/15646409.html
Copyright © 2011-2022 走看看