LeetCode之最长公共子序列问题LCS解决方法

2023-11-12

Leetcode官网解答 使用动态规划原理,请参考原文地址:

https://leetcode-cn.com/problems/longest-common-subsequence/solution/zui-chang-gong-gong-zi-xu-lie-by-leetcod-y7u0/

image.png

图片来源官网解答:

那么问题来了,如何实现输出答案字符串呢?

下面是我的思路;

使用queue用来存储中间数据(字符串及下一次的ID),相当于BFS遍历。

从最后一个网格倒叙进行解答,查询字符是否一致,一致则加入字符串否则存储下一个的可能方向。

直到达到最底层。

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int m = text1.length(), n = text2.length();
        vector<vector<int>> vec(m+1,vector<int>(n+1));
        
        for(int i = 1; i <= m; i++)
        {
            char c1 = text1[i-1];
            for(int j = 1; j <= n; j++)
            {
                char c2 = text2[j-1];
                if(c1 == c2)
                    vec[i][j] = vec[i-1][j-1]+1;
                else
                    vec[i][j] = max(vec[i-1][j],vec[i][j-1]);
            }
        }

        //print all subsequences
        //last char position
        queue<pair<string,vector<int>>> q;
        q.push(pair<string,vector<int>>("",{m,n}));
        while(!q.empty())
        {
            string curr = q.front().first;
            vector<int> pos = q.front().second;
            q.pop();
            if(text1[pos[0]-1] == text2[pos[1]-1])
            {
                curr = text1[pos[0]-1] + curr;
                if(pos[0] > 1 && pos[1] > 1)
                {
                    q.push(pair<string,vector<int>>(curr,{pos[0]-1,pos[1]-1}));
                }
            }
            else
            {
                if(vec[pos[0]-1][pos[1]] == vec[pos[0]][pos[1]])
                {
                    if(pos[0] > 1 && pos[1] >= 1)
                    {
                        q.push(pair<string,vector<int>>(curr,{pos[0]-1,pos[1]}));
                    }
                }
                if(vec[pos[0]][pos[1]-1] == vec[pos[0]][pos[1]])
                {
                    if(pos[0] >= 1 && pos[1] > 1)
                    {
                        q.push(pair<string,vector<int>>(curr,{pos[0],pos[1]-1}));
                    }
                }
            }
           if(curr.length() == vec[m][n])
            cout << curr << endl;

        }
        return vec[m][n];

    }
    
};

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode之最长公共子序列问题LCS解决方法 的相关文章

随机推荐

  • 初级1 题目一 时间复杂度及示例

    1 什么是时间复杂度 常数时间的操作 一个操作如果和数据量没有关系 每次都是固定时间内完成的操作 叫做常数操作 一个算法流程中 常数操作数量的指标 就是常数操作在算法里总共有多少次 称为时间复杂度 常用O 读作big O 来表示 具体来说
  • 如何选择一款趁手的光纤测试仪

    光纤测试仪是一种用于物理学 电子与通信技术领域的物理性能测试仪器 于1996年11月1日启用 常用光纤测试表有 光功率计 光万用表 稳定光源 光时域反射仪 OTDR 和光故障定位仪 如何选择合适的光纤测试仪 选择光纤测试仪表 一般需考虑以下
  • 虚拟化原理以及应用(8)课堂笔记-第三章KVM的概述第四章-课堂笔记-virt-manager默认方式创建虚拟机(1)

    一 KVM的概念 重点 KVM关键词 1 基于Linux内核的全虚拟化解决方案 运行在支持硬件虚拟化功能的X86平台 Intel VT 或AMD V 基于LINUX内核的全虚拟化的解决方案 运行在支持硬件虚拟化功能的x86平台 intel
  • RNN(循环神经网络)

    文章目录 RNN概述 RNN模型 RNN前向传播算法 RNN反向传播算法推导 RNN小结 DNN的特例CNN的模型和前向反向传播算法 这些算法都是前向反馈的 模型的输出和模型本身没有关联关系 今天我们就讨论另一类输出和模型间有反馈的神经网络
  • Vue.config.productionTip = false 是什麽意思

    阻止启动生产消息 常用作指令 阻止启动生产消息 這又是什麽意思 看下效果 Vue config productionTip false Vue config productionTip true 感覺多了一行信息
  • python3(二)Numpy

    这两个库都是基于C语言的 所以这两个库的计算速度相比python的list或dict来说很快 pandas又是基于numpy的库 相当于numpy的升级版本 并且用到了矩阵的计算 计算速度相比利用单个数据或字典 列表来说 快很多 1 基本
  • CAD+开发小结+交互+选择集+深度拷贝AcDbObjectId中指向的实体集+读取其他DWG文件

    深度拷贝将数组中的实体ID指向的实体拷贝至blockId为ID的块中 AcDbIdMapping adimIdMap AcApDocument pDoc acDocManager gt curDocument acDocManager gt
  • 【Kubernetes部署篇】Kubeadm方式搭建K8s集群 1.27.0版本

    文章目录 一 集群规划及架构 二 系统初始化准备 所有节点同步操作 三 安装并配置cri dockerd插件 四 安装kubeadm 所有节点同步操作 五 初始化集群 六 Node节点添加到集群 七 安装网络组件Calico 八 测试Cor
  • sqli labs less 25

    按照常规输入id 1 提示报错信息如下 一个很常见的报错 可以看出是单引号闭合的语句 输入 id 1 or 1 报出的错误信息不明显 加入一个括号进行试探能不能报出更多的语句错误 输入 id 1 or 1 从上图看出来or 被屏蔽了 经过更
  • ubuntu搭建android编译环境

    本文来自linux与嵌入式技术Q群52240781 ubuntu12 04 14 04安装后搭建android编译环境 注安装的是64位ubuntu系统12 04或14 04 请安装ubuntu的LTS版即12 04或14 04 每2年发布
  • 87_BigDecimal的doubleValue()、toString()、toPlainString()与科学计数法

    主题 BigDecimal toPlainString 可以避免出现科学计数法格式的数据 项目上面有个小伙伴在用Bigdecimal进行数值计算时 用return num doubleValue 的方式将结果送到前台 测试数值较小时无问题
  • 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

    报错如下 检查npm目录下是否还有node exe文件如果没有复制过来 我复制过来问题解决 首先我是node和npm版本和项目版本不适应 需要更换版本 所以重新安装node js在重新安装的过程中将安装的位置改变了 所以造成了这个可能
  • DSS简介

    原文链接 去中心化软件服务 DSS 是一个基于CCR的轻量级 net运行时环境 DSS提供了一个轻量级的 状态导向的服务模型 它将REST概念和构造高性能高扩展性应用的系统级方法结合在一起 在DSS中服务被暴露为一种可以被程序和UI操作界面
  • 将 Tocmat5.0 注册为 Windows 的服务程序

    将 Tocmat5 0 注册为 Windows 的服务程序 步骤 1 下载 Tomcat 5 0 x 不要下载安装版本 2 解压到 TOMCAT HOME 3 安装或者从别处拷贝JRE 推荐拷贝 可以删除不需要的文件 如文档等 4 在 TO
  • Qt编译MySQL数据库驱动

    文章目录 一 我的编译环境 二 需要 三 Qt的下载 四 编译驱动 主题 4 1 第一步打开msql pro 4 2 第二步 4 3 第三步 4 4 第四步 4 5 第五步 编译 最后一步 一 我的编译环境 Qt 5 14 2 mingw7
  • 大模型时代,企业如何重构 AI 应用落地范式?

    近一年来 生成式人工智能 AIGC 技术的快速发展和各种大模型的涌现 引发了全球范围内对于通用人工智能 AGI 时代是否即将到来的讨论 在 AIGC 大模型公共服务逐渐被大众辩证地接受后 如何用 AIGC 技术重塑企业智能服务成为一个深水区
  • 使用Jmeter进行http接口做功能、性能测试

    使用Jmeter进行http接口做功能 性能测试 1 使用Jmeter进行http接口做功能 性能测试 在测试移动APP时 会有很多接口需要做测试 我在这里介绍一下对HTTP接口做功能 性能的测试 首先我们会从开发人员拿到接口数据 1 1
  • 苹果IOS开发者账号总结

    详细地址 https developer apple com programs which program 个人账号 Individual 费用99美金一年 该账号在App Store销售者只能显示个人的ID 比如zhitian zhang
  • Linux 查看进程消耗内存情况总结

    在Linux中 有很多命令或工具查看内存使用情况 今天我们来看看如何查看进程消耗 占用的内存情况 Linux的内存管理和相关概念要比Windows复杂一些 在此之前 我们需要了解一下Linux系统下面有关内存的专用名词和专业术语概念 物理内
  • LeetCode之最长公共子序列问题LCS解决方法

    Leetcode官网解答 使用动态规划原理 请参考原文地址 https leetcode cn com problems longest common subsequence solution zui chang gong gong zi