【将字符串变为空的编辑距离】

题目描述

求由s串变成t串的编辑距离
在s串的开头/末尾添加一个字符,花费p
在s串的开头/末尾添加一个s串的子串,花费q
每次作都是基于当前的s串
s串初始为空

分析

等价于将一个字符串变为空串的过程

第一层按照长度遍历(如果按照下标i,j遍历,在考虑左子串的时候,会用dp[r+1,j] + q更新dp[i][j],r+1 >=i, 会出现用未知值算未知值的情况)

考虑每一种状态转移:左子串,右子串,左开头,右开头

代码

# 求由s串变成t串的编辑距离
# 在s串的开头/末尾添加一个字符,花费p
# 在s串的开头/末尾添加一个s串的子串,花费q
# 每次作都是基于当前的s串
# s串初始为空

# dp[i][j] 代表 从下标i的字符开始,到下标j的字符结束的子串 变为空需要的最小花费


# 按照长度,考虑下标的边界情况,
# 转移时不能直接复制,取min
# 相同的数据类型进行比较


def ans(s:str, p:int, q:int):
    n = len(s)
    dp = [[1e9]*(n+1) for i in range(n+1)] # 初始化最大
    dp[0][0] = p


    for lenth in range(1, n+1):
        for i in range(n-lenth+1):
            j = i+lenth-1
            if i == j:
                dp[i][j] = p
            else:              
                # 右边子串
                for l in range(i,j+1):
                    sub_s = s[l:j+1]
                    if sub_s in s[i:l]:
                        dp[i][j] = min( dp[i][j], dp[i,l-1] + q )  
                
                # 左边子串
                for r in range(i,j+1):
                    sub_s = s[i:r+1]
                    if sub_s in s[r+1:j+1]:
                        dp[i][j] = min( dp[i][j], dp[r+1,j] + q)  # 取min
                
                # 删一个字符
                dp[i][j] = min(dp[i][j], dp[i][j-1]+p, dp[i-1][j]+p)             

            
    return dp[0][n-1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值