蓝桥杯算法训练VIP-求先序排列

2023-11-18

题目

题目链接

题解

递归。


首先要了解什么是先序遍历,中序遍历和后序遍历。
大佬讲解树的遍历


一般同学们应该都知道如何遍历。
这个题有点像模拟实现题,就是把你手算的过程实现一遍。

整体思路:
先从后序遍历中确定根,再去中序遍历中找到根的左右两侧的子树,再根据中序遍历中确定的左子树,从后序遍历中找到对应的左子树,后序遍历中左子树的根就是左子树序列中的最后一个字母,右子树同左子树。现在我们又得到一个根了,又可以重复上面的过程了。


递归函数我们每次传递中序遍历中此子树的起始索引和终止索引、后序遍历中此子树的起始索引和终止索引、以及这棵子树的结点个数(本质上就是序列的长度)。
递归函数中:
后序遍历的最后一个字母就是这棵子树的根,知道了根的字母,又由于题目说每个结点的字母都不一样,因此我们去遍历中序遍历找到根这个字母所在的索引,以此为分界线,可以将子树划分为子树的左子树和子树的右子树;
知道子树的左右子树(下统称左右子树)分别具有哪些字母了,我们就根据这些字母去后序遍历中确定左右子树。确定的方式也非常简单,我们只要确定出后序遍历中哪一段是左子树,那么剩下一段一定是右子树,因为它们都是连续的一段。我们用两层循环去遍历,外层是中序遍历的左子树字母,内层是后序遍历的字母,只要相等就说明内层遍历到的是左子树的字母,我们就更新一下左子树字母在后序遍历中的最大索引,这样一来从后序遍历序列的头到这个位置都是左子树,而从这个位置一直到尾的前一个都是右子树(尾部是根的字母)。序列长度也很好计算吧。
这样我们就可以继续递归左子树,递归右子树了,边界条件是长度为0,直接返回。
我们其实可以在遇到递归函数中直接输出每次遇到的根,因为是先序遍历嘛,这样完全没问题,而且还不用存下树的结构,很方便。


这个题思路几乎是秒出,但是一点点的小细节把我人卡傻了,split初始化为l2在某些情况下陷入死循环,比如代码下面注释的样例。这组样例是我从网上别人的博客里乱翻出来的,一试真死循环了,找了好久才找到这个样例的。太离谱了。

代码

#include<bits/stdc++.h>
using namespace std;

int n;
string s1, s2;

void dfs(int l1, int r1, int l2, int r2, int len) { // s1:中    s2:后 
	if(len <= 0) return ;
	cout << s2[r2]; // 直接输出 
	int pos = l1, split = l2-1; // pos是中序遍历中根所在索引,split是后序遍历中左子树最右边字母的索引 
	for(;pos <= r1;pos ++) if(s1[pos] == s2[r2]) break; // 确定pos 
	
	for(int i = l1;i < pos;i ++)
	for(int j = l2;j < r2;j ++)
	if(s1[i] == s2[j]) split = max(split, j); // 确定split 
//	cout << pos << ' ' << split << endl;
	
	dfs(l1, pos-1, l2, split, pos-l1); // 左子树  
	dfs(pos+1, r1, split+1, r2-1, r1-pos); // 右子树 
	
}

int main()
{
	cin>>s1>>s2;
	n = s1.size();
	
	dfs(0, n-1, 0, n-1, n);
	
	return 0;
}

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

蓝桥杯算法训练VIP-求先序排列 的相关文章

  • 蓝桥杯2017年第八届真题-发现环

    题目 题目链接 题解 并查集 DFS 并查集比较明显 因为要判断有没有环 思路也很简单 若不停加边 若两个点的fa是一样的 则说明再加上这两点之间的直接 边就会出现环 因此这两个点一定位于环上 我们以两点中的其中一个点为起点 dfs寻找另一
  • 2017年蓝桥杯B组C/C++省赛-K倍区间

    题目 题解 思维 暴力的话是会超时的 但也可以骗点分 采用差分数组暴力 讲一下AC思路 统计出来每个前缀和取模 k k k后结果的个数 比如 c n t
  • 第十一届蓝桥杯C/C++B组省赛-平面切分

    题目 题目链接 题解 计算几何 存在这么一个结论 向一个平面中加入一条直线 分两种情况 若新加入的直线不与平面中的任何一条直线重合 则向平面中加入该直线对平面部分数的贡献为 平面中已经存在的直线与该直线相交得到的不同的交点数 1 若新加入的
  • 蓝桥杯2015年第六届真题-奇怪的数列

    题目 题目链接 题解 实现题 太简单了 就是遍历字符串 拼接一下就可以了 代码 include
  • 蓝桥杯算法训练VIP-比赛安排

    题目 题目链接 题解 DFS 本题我们要开两个标记数组 flag数组是个二维数组 用于标记某两只队伍是否进行过比赛了 另一是一维数组vis 用于标记某只队伍是否比过赛 两个数组的作用范围不同 vis数组只在每一行中有效 每到下一行时 vis
  • 蓝桥杯算法提高VIP-棋盘多项式

    题目 题目链接 题解 DFS 整体思路 横向分块 如下 我们只需要按连通块的序号去深搜即可 对于每个连通块 我们可以选择其中的任何一个空格作为放 車 的位置 或者选择不在这个连通块中放 車 因此 我们的问题转化为在dfs中如何确定连通块 如
  • [蓝桥杯][2013年第四届真题]危险系数

    题目 题目链接 题解 DFS 蓝桥杯中 一般看到图不是BFS就是DFS 代码1对应第一种方法 我的方法 根据关键点的定义 删除这个点之后 无法实现从u到v 那么我们就枚举每个点作为删除点 判断删除这个点之后还能不能实现从u到v 若不能说明删
  • [蓝桥杯][2014年第五届真题]兰顿蚂蚁

    题目 题目链接 题解 DFS 没什么难的吧 可能实现的时候用时长短 代码简洁程度不同而已 代码 include
  • 蓝桥杯2019年第十届省赛真题-扫地机器人

    题目 题目链接 题解 二分 贪心 二分模板 看到这道题第一时间想到的就是二分和动规 仔细一看二分有戏 能check出来 所以决定用二分好好想想 主要是因为我动规太菜了 怕了 二分时间 准确的说我们二分的不是时间 而是覆盖范围 也就是枚举每个
  • 蓝桥杯2015年第六届真题-广场舞

    说在前面 其他博客中的代码应该保证不了健壮性 我这个 应该 可以 题目 题目链接 题解 数学 计算几何 提示 这题默认好像是顺时针或逆时针输入坐标 也就是说先后输入的两个点一定是多边形的一条边 前置知识 PNPoly算法 何为PNPoly算
  • 2017年蓝桥杯B组C/C++省赛-分巧克力

    题目 题目链接 题解 二分 想到二分比实现二分要难点 可行解部分可以与不可行解部分完美地分隔开来 绿色部分是分成的巧克力比较小时都可以满足 而大于一定程度的时候就不可行了 所以可以将其抽象成小于可行 大于不可行的二分问题 在判断时 遍历全部
  • 蓝桥杯2020年第十一届省赛真题-子串分值

    题目 题目链接 题解 思维 考虑每个字符对最终答案的贡献 每个字符的贡献为其左侧连续与之不相同的字符个数 1乘以其右侧与之不相同的字符个数 1 样例 ababc 第一个字符a的贡献 0 1 1 1 2 a ab 第二个字符b的贡献 1 1
  • 蓝桥杯历届试题-小朋友排队

    题目 题目链接 题解 树状数组求逆序对 好早之前写过逆序对的三种求法 看明白了树状数组求逆序对的方法后本题就很轻松了 本题思路 高矮不满足要求的相邻两个小朋友要互换位置 且二者的不高兴程度都是增加 所以对于某个小朋友而言 其左侧的高个会与其
  • 2021蓝桥杯模拟赛-受伤的皇后

    题目 题目链接 题解 DFS 八皇后问题改编而已 加入判断左上三格内和右上三格内是否存在皇后 代码 include
  • 蓝桥杯2015年第六届真题-赢球票

    题目 题目链接 题解 暴力 模拟 枚举每次从哪个位置开始 也就是有n种情况要枚举 对于每一种情况 我们都模拟这个过程 更新最大值 取牌操作结束的条件是还未被取走的数中的最大值都小于报的数了 说明没有办法取走任何一张了 此时结束 注意答案要求
  • L2-016 愿天下有情人都是失散多年的兄妹 (25 分)

    题目 题目链接 题解 DFS 孩子向父母方向连边 将孩子视为根节点 首先判断输入两个人的性别 如果不同再分别以二者为起点进行dfs 前者五服之内的亲属都标记一下 以后者为起点dfs 如果遇到了标记的人 那么说明五服之内存在公共祖先 不可以结
  • 【限时免费】20天拿下华为OD笔试之【DFS/BFS】2023B-寻找最大价值的矿堆【欧弟算法】全网注释最详细分类最全的华为OD真题题解

    DFS BFS 2023B 寻找最大价值的矿堆 题目描述与示例 给你一个由 0 空地 1 银矿 2 金矿 组成的的地图 矿堆只能由上下左右相邻的金矿或银矿连接形成 超出地图范围可以认为是空地 假设银矿价值 1 金矿价值 2 请你找出地图中最
  • 2021年蓝桥杯A组省赛-左children右sibling

    CXXX有毛病 左孩子右兄弟 字眼很敏感吗 题目 题目链接 题解 贪心 DFS 以 u u u 为根的子树选择包含节点最多的以 v v v 为根的子树作为最后连接的右兄弟能保证树向下延展的最多 所以重点转换为了计算以
  • 蓝桥杯算法训练VIP-求先序排列

    题目 题目链接 题解 递归 首先要了解什么是先序遍历 中序遍历和后序遍历 大佬讲解树的遍历 一般同学们应该都知道如何遍历 这个题有点像模拟实现题 就是把你手算的过程实现一遍 整体思路 先从后序遍历中确定根 再去中序遍历中找到根的左右两侧的子
  • L3-014 周游世界 (30 分)

    题目 题目链接 题解 DFS 采用的数据结构 vector 索引为起点 值为 终点 起点公司编号 当然你也可以保存终点公司编号 但是代码中的语句就需要改一下了 dfs 传入四个信息 当前节点 遇到的节点数 换乘数 当前节点所在公司的编号 由

随机推荐

  • 对话框中添加视图方法- CScrollView

    对话框中使用视图方法 今天工作过程中 又遇到了显示图片问题 为此把以前的代码整理一下 通过使用自定义的类继承CScrollView类 是图片或文字等 等能够通过滑块进行自动操作显示 记录查询 步骤 1 建立基本对话框程序 添加一个stati
  • 多线程之设计模式之Listener设计模式(观察者设计模式)

    虽然设计模式我们一般中用的很少 但是作为程序员设计模式是我们自我修养的一部分 so最近学习了一个设计模式 记下来喽 观察者模式 有时又被称为模型 视图 View 模式 源 收听者 Listener 模式或从属者模式 是软件设计模式的一种 在
  • 二、RISC-V SoC内核注解——译码 代码讲解

    tinyriscv这个SoC工程的内核cpu部分 采用经典的三级流水线结构进行设计 即大家所熟知的 取值 gt 译码 gt 执行三级流水线 另外 在最后一个章节中会上传额外添加详细注释的工程代码 完全开源 如有需要可自行下载 上一篇博文中注
  • C++泛型中的类模板参数

    数据类型表 用户经由模板参数传递到模板的数据类型只在模板中有效 为模板所私有且数目种类有限 限制了模板之间的协作 类似于类之间要互相协作时 里面的数据成员都要是public 对互相公开所以可以方便使用 故在同一个泛型系统内部模板应该公开私有
  • 分段线性插值

    N 10 定义插值节点的个数 x 5 10 N 5 依据课本xi 5 i h i 0 1 N h 10 N y x 1 x 4 依据课本 1 插值公式 xi 5 0 25 5 依据课本xk 5 0 25k k 0 1 40 m length
  • vmware15/16/17 安装centos7失败卡顿等一系列问题及解决方案

    vmware15 failed to install the hcmon driver failed to install the USB inf 突然某一天 虚拟机运行的centos7很卡 于是想着重装一下 使用vmware15安装cen
  • LVGL---文本框(lv_textarea)

    目录 lv textarea文档地址 lv textarea文档地址 lvgl中文版本 v8 2 对应网盘中文文档 LVGL官方英文原版 v8 2
  • JQuery中&(‘#form‘).serialize()方法失效

    JQuery中serialize方法失效 要按照以下步骤检查 1 id是不是重名 2 hidden和display none设置以后 元素并不会被序列化 后台也无法获取 检查是不是有这个属性 3 form标签中的input标签中id和nam
  • 极简短网址链接生成系统网站源码

    极简短网址链接生成系统 前两年流行的新浪短网址和一些小站长搭建的短网址基本都gg了 想要一个既稳定又好用的短网址系统只有自己搭建了 今天给大家分享一个很好用的短网址系统 本系统是国内程序员开发 后台简洁 适合自用 安装教程 1 上传源码并解
  • .net下用c# 编写成语字典查询工具

    呵呵 以前弄的一个成语字典数据库 最近用C 写了个查询工具 界面 源代码如下 http blog csdn net greenerycn 请遵守署名非商业的CC版权 using System using System Collections
  • 【往届均已检索】2023年控制理论与应用国际会议(ICoCTA 2023)

    往届均已检索 2023年控制理论与应用国际会议 ICoCTA 2023 重要信息 会议网址 www icocta org 会议时间 2023年10月20 22日 召开地点 福建 厦门 截稿时间 2023年8月30日 录用通知 投稿后2周内
  • 时间格式2019-06-27T16:00:00.000Z转换为北京时间

    时间的描述 UTC 国际时间 UTC 8 伦敦时间 UTC 8就是国际时加八小时 是东八区时间 也就是北京时间 String dateTime 2019 06 27T16 00 00 000Z dateTime dateTime repla
  • 让ChatGPT帮你写一个剧情脚本

    最近 很多视频制作者正在使用AI编写视频脚本 效率直接提升20倍以上 而ChatGPT作为一个强大的AI模型 在各个领域都得到了广泛应用 尽管对于ChatGPT的介绍不是很多 但是它已经在很多自媒体平台上被广泛利用来处理工作了 如果你想学习
  • 激活函数及其各自的优缺点

    原文链接 感谢原作者 温故知新 激活函数及其各自的优缺点 1 什么是激活函数 所谓激活函数 Activation Function 就是在人工神经网络的神经元上运行的函数 负责将神经元的输入映射到输出端 激活函数对于人工神经网络模型去学习
  • 整体学习法之信息分类

    在学习的时候 我们都是有一个流程 获取信息 gt 理解信息 gt 扩展信息 gt 纠正信息 gt 应用信息 信息分成以下几类 随意信息 比如太阳半径多少 苹果的价格这些 都是一些毫无规律的东西 这些就是靠机械记忆 几乎不需要什么处理 也没有
  • [YOLO专题-16]:YOLO V5 - 如何把labelme json训练数据集批量转换成yolo数据集

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122334367 目录 前言 第1章
  • Java高级开发工程师面试题汇总

    面试主要涉及到的技术点 概述 以Java编程基础 JVM原理 Spring Spring Boot Redis Zookeeper 消息队列 Kafka Rocket MQ MySQL等为主 也包括Dubbo Tomcat性能优化 容器化技
  • 被腾讯云的AI绘画整破防了

    购买 618活动 贪便宜29 9买了个腾讯云的AI绘画 问题 主要遇到了两个问题 整破防了兄弟们 1 文档问题 只封装了请求之后获取base64格式的图片 没有封装如何从base64转换成图片展示出来 这个还需要自己去开发 2 sdk 安装
  • mysql 续行符_继续字符集——「一个命令行搞懂Mysql字符集」

    其实我纠结挺久 要不要写这一篇文章 不怎么想让大家感觉我好像只会字符集一样 Mysql在数据的存储上 提供了不同的字符集支持 在数据的比对上 又提供了不同的字符序支持 与Oracle实例级别的设置不同 Mysql很灵活 它提供了不同级别的设
  • 蓝桥杯算法训练VIP-求先序排列

    题目 题目链接 题解 递归 首先要了解什么是先序遍历 中序遍历和后序遍历 大佬讲解树的遍历 一般同学们应该都知道如何遍历 这个题有点像模拟实现题 就是把你手算的过程实现一遍 整体思路 先从后序遍历中确定根 再去中序遍历中找到根的左右两侧的子