码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 代码随想录算法训练营Day55 (Day 54休息) | 动态规划(15/17) LeetCode 392.判断子序列 115.不同的子序列


    继续子序列的练习!

    第一题

    392. Is Subsequence

    Given two strings s and t, return true if s is a subsequence of t, or false otherwise.

    A subsequence of a string is a new string that is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (i.e., "ace" is a subsequence of "abcde" while "aec" is not).

    首先想到双指针的解法,复杂度为O(n),也能接受。不过既然在练习动态规划,就还是按照动态规划的思路去解。

    在确定递推公式的时候,首先要考虑如下两种操作,整理如下:

    • if (s[i - 1] == t[j - 1])
      • t中找到了一个字符在s中也出现了
    • if (s[i - 1] != t[j - 1])
      • 相当于t要删除元素,继续匹配

    if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1;,因为找到了一个相同的字符,相同子序列长度自然要在dp[i-1][j-1]的基础上加1

    if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];

    1. class Solution:
    2. def isSubsequence(self, s: str, t: str) -> bool:
    3. dp = [[0] * (len(t)+1) for _ in range(len(s)+1)]
    4. for i in range(1, len(s)+1):
    5. for j in range(1, len(t)+1):
    6. if s[i-1] == t[j-1]:
    7. dp[i][j] = dp[i-1][j-1] + 1
    8. else:
    9. dp[i][j] = dp[i][j-1]
    10. if dp[-1][-1] == len(s):
    11. return True
    12. return False

    第二题

    115. Distinct Subsequences

    Given two strings s and t, return the number of distinct subsequences of s which equals t.

    The test cases are generated so that the answer fits on a 32-bit signed integer.

    这道题双指针就没法做了,只能用动态规划。

    递推公式为:dp[i][j] = dp[i - 1][j];

    从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j] 是从上方和左上方推导而来,那么 dp[i][0] 和dp[0][j]是一定要初始化的。

    1. class Solution:
    2. def numDistinct(self, s: str, t: str) -> int:
    3. n1, n2 = len(s), len(t)
    4. if n1 < n2:
    5. return 0
    6. dp = [0 for _ in range(n2 + 1)]
    7. dp[0] = 1
    8. for i in range(1, n1 + 1):
    9. prev = dp.copy()
    10. end = i if i < n2 else n2
    11. for j in range(1, end + 1):
    12. if s[i - 1] == t[j - 1]:
    13. dp[j] = prev[j - 1] + prev[j]
    14. else:
    15. dp[j] = prev[j]
    16. return dp[-1]

  • 相关阅读:
    哪种IP更适合你的数据抓取需求?
    一款比ping强大百倍的跨平台工具gping
    机器学习案例之客户的信用风险与预测
    【kali-漏洞利用】(3.4)免杀Payload 生成工具(下):Veil后门使用、监听失败原因
    Spring进阶(AOP的应用)—— 动态代理AOP后controller层的private方法访问失效的问题
    计算机网络 应用层的考纲内容 网络应用模型 域名系统
    C++课程设计《最短路径》
    Git工作流
    SpringBoot - 如何将项目打包成WAR包?
    5 个适用于 Windows 10 和 11 的最佳 PDF 转 Word 转换器
  • 原文地址:https://blog.csdn.net/Hanzq1997/article/details/133132097
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号