【代码随想录算法训练营第五十一天|115.不同的子序列、583. 两个字符串的删除操作、72.编辑距离】

文章目录

115.不同的子序列

dp数组表示s和t中前i-1j-1项中s中出现过的t的次数,递推公式中当选择到s的第i-1的元素和tj-1相等时,需要考虑两种情况,第一种是选择用si-1这个元素和tj-1匹配,那么dpij就应该是dpi-1j-1,如果不使用si-1的话,就应该是和dpi-1j相同,因此dp[i][j] = dp[i-1][j-1] + dp[i-1][j]。当si-1不等于tj-1时,就相当于是不使用si-1和t:j匹配的情况,因此赋值为dpi-1j

python 复制代码
class Solution:
    def numDistinct(self, s: str, t: str) -> int:
        len1 = len(s)
        len2 = len(t)
        dp = [[0]* (len2+1) for _ in range(len1+1)] # dp[i][j] 前一位是s后一位是t,t不变在s中删减,当t=''的时候dp[i][0]应该为1 
        for d in dp:
            d[0] = 1
        for i in range(1, len1+1):
            for j in range(1, len2+1):
                if s[i-1] == t[j-1]:
                    dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
                else:
                    dp[i][j] = dp[i-1][j]
        return dp[-1][-1]

583. 两个字符串的删除操作

其实就是找两个数组相同的公共子序列长度,最后输出的时候拿两个数组的长度和减去两倍的最大公共子序列长度就可以。

python 复制代码
class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        len1 = len(word1)
        len2 = len(word2)
        dp = [[0]*(len2+1) for _ in range(len1+1)] # dp[i][j]表示word1选择前i位,word2选择前j位的时候两个字符串相同字符的个数
        for i in range(1, len1+1):
            for j in range(1, len2+1):
                if word1[i-1] == word2[j-1]:
                    dp[i][j] = dp[i-1][j-1] + 1
                else:
                    dp[i][j] = max(dp[i-1][j], dp[i][j-1])
        return len1 + len2 - 2*dp[-1][-1]

72.编辑距离

本质上还是在找两个字符串的最长相同子序列,这里的增加操作和删除操作其实可以看作是同一种操作,只是在两个字符串上反过来,因此需要增加一个字符也可以看作是另一个字符种删除掉这个字符,所以当word1和word2的字符i和j不相等的时候,dpij在dpi-1j即删除word1元素,dpij-1即删除word2元素,和dpi-1j-1即替换元素中选择最小的,然后+1。还有一个重要的是初始dp的时候需要对所有一个为空另一个不为空的时候的dp赋予初值,初值就是那个字符串的长度。

python 复制代码
class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        len1 = len(word1)
        len2 = len(word2)
        dp =[[0] * (len2+1) for _ in range(len1+1)]
        for i in range(len1+1):
            dp[i][0] = i
        for j in range(len2+1):
            dp[0][j] = j
        for i in range(1, len1+1):
            for j in range(1, len2+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], dp[i][j-1], dp[i-1][j-1]) + 1
        return dp[-1][-1]
相关推荐
ZPC821029 分钟前
YOLO26 识别串番茄果梗
人工智能·深度学习·算法·机器学习
景熙55231 小时前
14.Java 集合框架从入门到源码万字详解(含 ArrayList/LinkedList/HashMap 源码、泛型通配符、红黑树)
java·开发语言·数据结构·算法
aaaameliaaa1 小时前
结构体 结构体
c语言·笔记·算法
有Li2 小时前
【AI答疑】MR数据预处理步骤
人工智能·笔记·算法·语言模型·医学生
盛世宏博北京2 小时前
多传感器数据融合算法:实现档案库房温湿度全域无死角监测
算法·档案温湿度
AgentMaster3 小时前
零售行业智能客服系统怎么选?3 大场景落地与 4 款平台对比实践
大数据·人工智能·算法
远航计算机3 小时前
客服记录怎么变成 AI 会引用的内容?五步清洗法
大数据·人工智能·算法·aigc
码流子3 小时前
几万路监控怎么接:高速公路视频汇聚平台的架构设计与落地坑点
大数据·人工智能·物联网·算法·架构
万物智能4 小时前
PWM散热风扇设置—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
前端·后端·算法
北极有牛4 小时前
cuda算子--矩阵转置
人工智能·算法