当前位置: 首页 > news >正文

动态规划专练:力扣第1035、392题

力扣第1035题-不相交的线

1.本题和力扣第1143题-最长公共子序列一模一样,不能让线相交本质上就是不能走回头路,相对顺序不能改变,即公共子序列需要按顺序排列。完整代码如下:

1. int maxUncrossedLines(int* nums1, int nums1Size, int* nums2, int nums2Size) { 2. // 一维滚动dp数组,dp[j]表示nums1前i个数字、nums2前j个数字能绘制的最多不相交连线 3. int dp[nums2Size + 1]; 4. memset(dp, 0, sizeof(dp)); 5. 6. for (int i = 1; i <= nums1Size; i++){ 7. // pre存储二维dp[i-1][j-1]的值,即本轮更新前的dp[j-1] 8. int pre = dp[0]; 9. for (int j = 1; j <= nums2Size; j++){ 10. // 保存更新前dp[j],作为下一轮j+1的pre 11. int cur = dp[j]; 12. if (nums1[i - 1] == nums2[j - 1]){ 13. // 数字相等,可以连线,数量等于左上角状态+1 14. dp[j] = pre + 1; 15. } else { 16. // 数字不等,继承上方或左侧更大的连线数 17. dp[j] = fmax(dp[j], dp[j - 1]); 18. } 19. pre = cur; 20. } 21. } 22. 23. return dp[nums2Size]; 24. }

该算法时间复杂度为O(nums1Size * nums2Size),空间复杂度为O(nums2Size)。

力扣第392题-判断子序列

1.可以使用双指针,t的指针cur2一直+1,s的指针cur1只有在两个指针所指字符相等的时候才+1,最后如果cur1 == len1就说明s是t的子集,否则就不是。完整代码如下:

1. bool isSubsequence(char* s, char* t) { 2. int len1 = strlen(s); 3. int len2 = strlen(t); 4. // s长度大于t,不可能是子序列 5. if (len1 > len2) return false; 6. 7. // cur1:s匹配指针,cur2:t遍历指针 8. int cur1 = 0, cur2 = 0; 9. while (cur1 < len1 && cur2 < len2){ 10. // 字符匹配,s指针后移 11. if (s[cur1] == t[cur2]){ 12. cur1++; 13. } 14. // t指针持续后移 15. cur2++; 16. } 17. 18. // s全部匹配完成则为子序列 19. if (cur1 == len1) return true; 20. return false; 21. }

该算法时间复杂度为O(m + n),空间复杂度为O(1)(m和n为字符串s和t的长度)。

2.本题也可以使用动态规划,本质上和力扣第1143题-最长公共子序列一模一样,只不过字符串s一定不会删除字符。最后只需要判断dp[len2]是否等于len1即可判断是否全部匹配。完整代码如下:

1. bool isSubsequence(char* s, char* t) { 2. int len1 = strlen(s); 3. int len2 = strlen(t); 4. // s更长一定不可能是子序列,直接返回false 5. if (len1 > len2) return false; 6. 7. // 一维滚动dp数组,dp[j]代表s前i个字符、t前j个字符的最长公共子序列长度 8. int dp[len2 + 1]; 9. memset(dp, 0, sizeof(dp)); 10. for (int i = 1; i <= len1; i++){ 11. // pre保存二维dp[i-1][j-1],更新前左上角的值 12. int pre = dp[0]; 13. for (int j = 1; j <= len2; j++){ 14. // 记录更新前dp[j],作为下一轮j+1的pre 15. int cur = dp[j]; 16. if (s[i - 1] == t[j - 1]){ 17. // 字符匹配,公共子序列长度 = 左上角值 + 1 18. dp[j] = pre + 1; 19. } else { 20. // 字符不匹配,取上方旧值或左侧新值较大者 21. dp[j] = fmax(dp[j], dp[j - 1]); 22. } 23. pre = cur; 24. } 25. } 26. // 若最长公共子序列长度等于s全长,说明s是t的子序列 27. return dp[len2] == len1; 28. }

该算法时间复杂度为O(m * n),空间复杂度为O(n)。

http://www.jsqmd.com/news/1392701/

相关文章:

  • Tools原语深度解析:从定义到调用全流程
  • UPC码怎么用?亚马逊上架与编码管理完整指南
  • XML Schema 字符串数据类型详解
  • 2026年GIS三维软件公司推荐:这几家口碑好且专业 - 选型|行业|价格|案例
  • 别再翻页截图了:GetQzonehistory让QQ空间历史说说备份一次搞定
  • 合肥蜀山区楼顶漏水怎么解决?2026 专业防水公司分享卫生间、楼顶、外墙、阳台 + 阳光房渗漏专业解决方案,一站式解决房屋漏水难题 - 超人防水
  • fSpy-Blender 终极拆解:一张照片如何在几分钟内重建出透视精准的 3D 场景
  • 2026年拍卖平台行业发展白皮书 和拍网运营体系详解 - 起跑123
  • 眉山电脑回收哪家靠谱?先看这几点资质口碑判断心里有底 - 官方资讯
  • Agent 评测的数据飞轮:如何把 Good Case 和 Bad Case 变成回归资产
  • 被会员墙、广告弹窗、强制登录折磨了三年,这款开源下载工具让我彻底卸载了某雷
  • 2026年工业水处理药剂价格选型分析:代表性品牌推荐与趋势指南 - 全域品牌推荐
  • 2026 河北拍摄剪辑教学实体店短视频制作学习攻略 - 中国华商产业观察网
  • 深度 | Rubin Ultra 双芯重构:CoWoS-L 翘曲如何逼 NVIDIA 放弃 1TB 旗舰
  • 2026年,口碑好的成都整厂设备回收服务商揭秘! - 甄选测评馆
  • 对标 Claude Cowork:DeepSeek Harness 公测,同步开放插件生态
  • 同样克重黄金,天津有人多赚上千!2026交易逻辑很多人没弄懂 - 每日快报资讯
  • 提示词工程进阶——让大模型输出你想要的JSON格式
  • 成都榻榻米定制新选择,舒适实用打造理想家居空间 - 官方资讯
  • 猫抓浏览器资源嗅探扩展完整攻略:三步装上,轻松搞定网页视频与M3U8下载
  • 2026 河北短视频培训教学服装店主短视频运营提升方法 - 中国华商产业观察网
  • 死档激活需要什么手续?实操流程直接抄 - 趣闻早乐评
  • Elicitation原语:Server向Client请求用户输入
  • Uniswap V3 AMM核心原理:集中流动性与Tick数学
  • 【Logisim 本地搭建】手动版无符号 8 位乘法器的详细教程
  • 2026智能称重传感器厂家哪家靠谱?优质厂家推荐与选型要点分享 - 商业新知
  • Nucleus Co-op 本地分屏联机完整指南:免费开源工具如何用一台电脑玩转 800+ 款游戏
  • OpenCore配置工具OCAT使用指南:免费跨平台搞定黑苹果EFI维护
  • 门店关停西安营业执照注销?提前备齐这几样,新手也能一次办成! - 实时传讯
  • 2026年韩国进口食品批发商前十,哪家更值得长期合作? - 官方资讯