38.动态规划之子序列-两个字符串的删除操作.py

# # 还是为了编辑距离做铺垫 | LeetCode:583.
#
# 给定两个单词word1和word2 ,返回使得word1和word2相同所需的最小步数。
# 每步可以删除任意一个字符串中的一个字符。
#
#
#
# 示例1:
# 输入: word1 = "sea", word2 = "eat"
# 输出: 2
# 解释: 第一步将"sea"变为"ea" ,第二步将"eat "变为"ea"
#
# 示例2:
# 输入:word1 = "leetcode", word2 = "etco"
# 输出:4

# 方法一:求最长公共子序列的长度l, res = len(word1)+len(word2) - l*2
# 1.dp[i][j] 以i-1结尾的word1和以j-1为结尾的word2的最长公共子序列
# 2 if word1[i-1] ==word2[j-1]:
#       dp[i][j] = dp[i-1][j-1]+1
#   else:
#       dp[i][j] =max(dp[i][j-1],dp[i-1][j])
# 3.初始化 dp
# 4.确定遍历顺序
# 5.打印dp

def get(word1, word2):
    m = len(word1)
    n = len(word2)
    dp = [[0] * (n+1) for _ in range(m+1)]
    l = 0
    for i in range(1, m+1):
        for j in range(1, n+1):
            if word1[i-1] == word2[j-1]:
                dp[i][j] = dp[i - 1][j - 1] + 1
            else:
                dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])
            l = max(dp[i][j], l)
    res = len(word1) + len(word2) - l * 2
    print(dp)
    return res
word1 = "sea"
word2 = "eat"
print(get(word1, word2))


# 方法2
word1 = "food"
word2 = "money"
# 1.dp[i][j] 删除word1中前i-1个字符和word2中前j-1个字符的最少的字符个数,使其相等
# 2.递推公式:if word1[i] ==word2[j]:
#           dp[i][j] = dp[i-1][j-1]
#         else:
#           dp[i][j] =max(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+2)
# 3.初始化
# 4.确定遍历顺序
# 5.打印dp

def get_del_num(word1, word2):
    m = len(word1)
    n = len(word2)
    dp = [[0] * (n+1) for _ in range(m+1)]
    for a in range(m+1):
        dp[a][0] = a
    for b in range(n+1):
        dp[0][b] = b
    # dp[0][0] =1
    for i in range(1, m+1):
        for j in range(1, n+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, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 2)
    print(dp)
    return dp[-1][-1]

print(get_del_num(word1, word2))









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值