zoukankan      html  css  js  c++  java
  • leetcode第72题:编辑距离

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

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

    1. 插入一个字符
    2. 删除一个字符
    3. 替换一个字符

    示例 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'
    网易面试时遇到了这题,当时没做出来,想不出来状态转移方程。
    解题思路如下:

    首先定义状态矩阵,dp[m][n],其中m为word1的长度+1,n为word2的长度+1,为什么+1?因为要考虑如果word1或word2为空的情况,后面可以看到。

    定义dp[i][j]为word1中前i个字符组成的串,与word2中前j个字符组成的串的编辑距离。

    插入操作:在word1的前i个字符后插入一个字符,使得插入的字符等于新加入的word2[j]。这里要考虑清楚,插入操作对于原word1字符来说,i是没有前进的,而对于word2来说是前进了一位然后两个字符串才相等的。所以此时是dp[i][j]=dp[i][j-1]+1。

    删除操作:在word1的第i−1​个字符后删除一个字符,使得删除后的字符串word[:i-1]与word2[:j]相同。这里要考虑清楚,删除操作对于原word2字符来说,j−1​是没有前进的,而对于word1来说是删除了一位然后两个字符串才相等的。所以此时是dp[i][j]=dp[i-1][j]+(0 or 1)。

    代码如下:

    class Solution:
    
        def minDistance(self, word1, word2):
            m=len(word1)+1; n=len(word2)+1
            dp = [[0 for i in range(n)] for j in range(m)]
    
            for i in range(n):
                dp[0][i]=i
            for i in range(m):
                dp[i][0]=i
            for i in range(1,m):
                for j in range(1,n):
                    if word1[i-1] == word2[j-1]:
                        dp[i][j] = dp[i-1][j-1]
                    else:
                        dp[i][j] = min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]) + 1
    
            return dp[m-1][n-1]
    
    word1 = "intention"
    word2 = "execution"
    test = Solution()
    print(test.minDistance(word1, word2))

    答案来源:https://blog.csdn.net/iyuanshuo/article/details/80112211 

    def minDistance(self, S1, S2):
        m = len(S1) + 1;
        n = len(S2) + 1
        dp = [[0 for i in range(n)] for j in range(m)]
        for i in range(n):
            dp[0][i] = i
        for i in range(m):
            dp[i][0] = i
        for i in range(1, m):
            for j in range(1, n):
                if S1[i - 1] == S2[j - 1]:
                    dp[i][j] = dp[i - 1][j - 1]
                else:
                    dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1
        return dp[m - 1][n - 1]
  • 相关阅读:
    用才情绽放的幸福之花
    我的爱车,你在哪里
    爱在网络,有没有错
    假如能抱着美女写诗
    只想爱你
    创业者和爱因斯坦的10大共同点(不是不可比的)
    心的感谢
    成大事必备9种能力.9种手段.9种心态
    一颗新星在陨落
    C++/C学习笔记(九)
  • 原文地址:https://www.cnblogs.com/tsdblogs/p/9977577.html
Copyright © 2011-2022 走看看