首页 > 试题广场 >

编辑距离(二)

[编程题]编辑距离(二)
  • 热度指数:38214 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入、删除和替换一个字符的代价,请输出将str1编辑成str2的最小代价。

数据范围:
要求:空间复杂度 ,时间复杂度
示例1

输入

"abc","adc",5,3,2

输出

2
示例2

输入

"abc","adc",5,3,100

输出

8

备注:

# -*- coding: utf-8 -*-

#
# min edit cost
# @param str1 string字符串 the string
# @param str2 string字符串 the string
# @param ic int整型 insert cost
# @param dc int整型 delete cost
# @param rc int整型 replace cost
# @return int整型
#
class Solution:
    """
    题目:
        https://www.nowcoder.com/practice/05fed41805ae4394ab6607d0d745c8e4?tpId=117&&tqId=37801&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
    算法:
        设dp[i][j]表示将字符串str1的前i个字符编辑为字符串str2的前j个字符所需的最小代价
        ic、dc、rc分别代表插入、删除和替换一个字符的代价,m, n分别为str1,str2的长度
        初始化:
            dp[0][0] = 0 # 空字符串 + 空字符串 = 空字符串,无需编辑
        状态转移方程:
            dp[i][0] = i * dc
            dp[0][j] = j * ic
            若str1[i-1] == str2[j-1]:
                dp[i][j] = dp[i - 1][j - 1]
            否则:
                dp[i][j] = min(dp[i][j-1] + ic,  # 对str1插入一个字符,进行匹配,匹配后,str2长度-1
                                dp[i-1][j] + dc # 删除字符str1[i-1],进行匹配,str1长度-1
                                dp[i - 1][j - 1] + rc) # 替换str1[i - 1]为str2[j - 1]进行匹配,两者长度均-1
        返回值:
            dp[m][n]
    复杂度:
        时间复杂度:O(mn)
        空间复杂度:O(mn)
    """

    def minEditCost(self, str1, str2, ic, dc, rc):
        m, n = len(str1), len(str2)

        dp = [[0] * (n + 1) for _ in range(m + 1)]

        for i in range(1, m + 1):  # str2长度为0,只能删除
            dp[i][0] = i * dc

        for j in range(1, n + 1):  # str1长度为0,只能插入
            dp[0][j] = j * ic

        for i in range(1, m + 1):
            for j in range(1, n + 1):
                if str1[i - 1] == str2[j - 1]:
                    dp[i][j] = dp[i - 1][j - 1]
                else:
                    dp[i][j] = min(dp[i][j - 1] + ic,
                                   dp[i - 1][j] + dc,
                                   dp[i - 1][j - 1] + rc)

        return dp[m][n]


if __name__ == '__main__':
    s = Solution()

    str1, str2, ic, dc, rc = "abc", "adc", 5, 3, 2

    # str1, str2, ic, dc, rc = "abc", "adc", 5, 3, 100

    res = s.minEditCost(str1, str2, ic, dc, rc)
    print res

发表于 2022-06-24 10:10:55 回复(0)