码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 1143. 最长公共子序列(C++实现)


    1143. 最长公共子序列icon-default.png?t=N7T8https://leetcode.cn/problems/longest-common-subsequence/

    1. int longestCommonSubsequence(string text1, string text2) {
    2. int m = text1.size(), n = text2.size();
    3. vectorint>> dp(m + 1, vector<int>(n + 1));
    4. for (int i = 0; i < m; ++i)
    5. {
    6. for (int j = 0; j < n; ++j)
    7. {
    8. if (text1[i] == text2[j])
    9. {
    10. dp[i + 1][j + 1] = 1 + dp[i][j];
    11. }
    12. else
    13. {
    14. dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);
    15. }
    16. }
    17. }
    18. return dp[m][n];
    19. }

    BM65 最长公共子序列(二)

    题目改成求最长公共子序列的同时、要输出这个子序列;

    如果使用 vector> 作为dp数组的话,空间复杂度将会达到O(n三次方);

    因此这里多用一个 vector> 来记录最长公共子序列的遍历路径,当遍历完成后、再根据这个路径来输出结果子序列。

    1. string LCS(string s1, string s2) {
    2. int m = s1.size(), n = s2.size();
    3. vectorint>> dp(m + 1, vector<int>(n + 1));
    4. vectorint, int>>> pre(m + 1, vectorint, int>>(n + 1));
    5. for (int i = 0; i < m; ++i)
    6. {
    7. for (int j = 0; j < n; ++j)
    8. {
    9. if (s1[i] == s2[j])
    10. {
    11. dp[i + 1][j + 1] = 1 + dp[i][j];
    12. pre[i + 1][j + 1] = {i, j};
    13. }
    14. else
    15. {
    16. if (dp[i][j + 1] > dp[i + 1][j])
    17. {
    18. dp[i + 1][j + 1] = dp[i][j + 1];
    19. pre[i + 1][j + 1] = {i, j + 1};
    20. }
    21. else
    22. {
    23. dp[i + 1][j + 1] = dp[i + 1][j];
    24. pre[i + 1][j + 1] = {i + 1, j};
    25. }
    26. }
    27. }
    28. }
    29. if (dp[m][n] == 0)
    30. {
    31. return "-1";
    32. }
    33. string res;
    34. int i = m, j = n;
    35. while (i != 0 && j != 0)
    36. {
    37. if (s1[i - 1] == s2[j - 1])
    38. {
    39. res = s1[i - 1] + res;
    40. }
    41. pair<int, int> temp = pre[i][j];
    42. i = temp.first;
    43. j = temp.second;
    44. }
    45. return res;
    46. }

     坑:

    最后的

    pair temp = pre[i][j];
    i = temp.first;
    j = temp.second;

    不能写成

    i = pre[i][j].first;

    j = pre[i][j].second;        // 此时 i 已被改变

  • 相关阅读:
    基于opencv答题卡识别基本处理_1
    微服务架构 | 分布式存储 -算法
    unity shaderGraph实例-可交互草地
    Linux项目自动化构建工具-make/Makefile
    算法与数据结构【30天】集训营——栈和队列的全套操作及易错知识点总结(07)
    小型气象站的分类和选型要点
    美团一面败在Redis,熬夜整理Redis 面试中常见的题目(附答案),3个月后卷土重来,成功拿下Offer!
    Spring Security oauth2.0 服务端
    万字解析设计模式之 装饰者模式
    传统安防音视频平台架构
  • 原文地址:https://blog.csdn.net/Kk_1025/article/details/132953235
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号