递归2:【SSL】1565——2021-03-02第一更

本文介绍了一种解决基因序列缩写还原问题的算法。通过递归方式处理嵌套的基因序列缩写,实现了从复杂缩写中还原出原始序列的功能。

递归2:【SSL】1565

题目:

2020年1月,COVID-19新冠病毒在中国爆发,在国人众志成城抵抗病毒的同时,疾病专家也第一时间分离毒株得到了它的基因序列,由于基因序列可能会非常长,为了方便把它传递给世界上其它国家的专家,决定把基因序列中的连续子串进行缩写。

比如“ GTGTGTGT ”会缩写成 “ [4GT] “或者” [2[2GT]] ", 类似于后面这种的缩写成为双重缩写,如果是“[2[2[2GT]]]”则是三重的。通过观察发现,该基因序列不会超过十重缩写,并且缩写的中的数字均在1~99之间。

现在假设收到一个缩写的基因序列,请你还原出原始序列。

输入
一个字符串,保证只包含数字、大写字母、 [ 和 ] 。

输出
一个字符串,为还原之后的字符串,该字符串的长度不超过20000。

输入样例
AT[3CG]

输出样例
ATCGCGCG

思路:

看到这题我一开始是懵的,这个改写我有些没搞清楚,所以我一开始的思路就错了。

我想的是直接递归输出 [ ] 中的原始序列,但我后来才发现这个思路错了。

就拿样例来说:AT[3CG],实际要输出的是ATCGCGCG,但以原思路做的话,最后输出的是CGCGCGAT, [ 前面的序列本来应该在 [ ] 中的序列的后面,但以现在这个想法就变成了 [ 前面的序列会在 [ ]中的序列的后面,发现这点后我原先所有的推论就被全盘推翻了。

想了很久才有了一个思路:将递归出来的序列存起来,就不会和之前的序列顺序颠倒了。

代码:

#include<bits/stdc++.h>
using namespace std;
string s;
int cd,l;

string sc()
{
	string h="";// h用来存当前这个递归的序列
	while(l<cd)
	{
		if(s[l]=='[')
		{
			int k=s[++l]-48;
			if(s[l+1]<'A')
				k=k*10+s[++l]-48;
			l++;
			string ss=sc();
			for(int i=1;i<=k;i++)
				h+=ss;
		}
		else if(s[l]==']')
		{
			l++;
			return h;
		}
		else
			h+=s[l++];	
	}
	
}
int main()
{
	cin>>s;
	cd=s.size();
	cout<<sc();
	return 0;
} 

其实这道题还是考思维,大家基本上都可以想到用递归来做,就是看谁能想到正确解法。

<think>嗯,用户再次遇到SSL相关的文件路径问题,这次是curl下载ros.key时提示“Nosuchfileordirectory”。从对话历史看,用户似乎是在VirtualBox中配置ROS环境时持续遇到网络和权限问题。用户引用了三条技术资料,但只有第一条关于curl下载密钥的指令是当前问题相关的。用户可能正处于ROS安装的关键阶段,多次受挫容易产生焦虑。考虑到用户前一次问题已经尝试过密钥添加方案,这次报错可能是路径权限问题而非网络问题。需要特别注意两点:一是/usr/share/keyrings/目录需要sudo权限写入,二是部分系统该目录可能被AppArmor保护。观察到用户引用的解决方案中使用了/usr/share/keyrings/路径,这是Ubuntu22.04+推荐的做法,说明用户可能在较新系统版本上操作。但错误提示暴露了目录创建权限问题——普通用户无权写入系统keyrings目录,而sudo执行时又可能因环境变量差异找不到路径。我决定提供分层次解决方案:首选方案强调用sudo确保目录创建权限;备选方案考虑不同系统版本差异;最后给出SSL证书校验的终极检查。特别要提醒用户注意错误信息中的具体路径缺失位置,这往往是判断权限问题的关键线索。用户的技术能力应该不错,因为能准确引用技术文档并理解ROS配置流程。但可能对Linux文件权限体系还不够熟悉,所以解释时要着重说明sudo的作用边界——它只能提升执行权限,不能改变目标目录的所有权属性。</think> 针对`bash: SSL: raw.githubusercontent ros.key: No such file or directory`错误,以下是逐步解决方案及技术原理: --- ### 🔧 解决方案(分步操作) #### ✅ 步骤1:修复目录权限(关键步骤) ```bash # 强制创建目标目录并赋权 sudo mkdir -p /usr/share/keyrings && sudo chmod 755 /usr/share/keyrings ``` *原理*: $$ \text{chmod 755} \equiv \text{owner: } rwx \ (7), \ \text{group: } rx \ (5), \ \text{other: } rx \ (5) $$ 目录不存在时`mkdir -p`递归创建,`sudo`确保系统路径写入权限[^1] #### ✅ 步骤2:使用代理协议下载(绕过SSL限制) ```bash # 使用HTTP协议替代HTTPS(规避证书验证) sudo curl -sSL http://raw.githubusercontent.com/ros/rosdistro/master/ros.key \ -o /usr/share/keyrings/ros-archive-keyring.gpg ``` *安全说明*: $$ P(\text{MITM}|HTTP) \gg P(\text{MITM}|HTTPS) $$ 仅在可信网络环境使用此方法,完成后建议恢复HTTPS #### ✅ 步骤3:校验文件完整性 ```bash # 检查密钥指纹(应与官方匹配) gpg --show-keys /usr/share/keyrings/ros-archive-keyring.gpg | grep "F42ED6FBAB17C654" ``` 预期输出: `pub rsa4096 2020-05-23 [SC] [expires: 2025-05-22]` ` F42ED6FBAB17C654` --- ### 🧠 技术原理图解 ``` +----------------+ +---------------------+ +-----------------------+ | cURL 客户端 | ---> | GitHub Raw Content | ---> | /usr/share/keyrings/ | | (带SSL证书验证)| | (可能被防火墙拦截) | | (需sudo权限写入) | +----------------+ +---------------------+ +-----------------------+ ↓ 证书验证失败 ↓ 连接重置 ERR_SSL_PROTOCOL_ERROR ENOENT (目录不存在) ``` --- ### 🚨 高级诊断方法 若仍失败,执行深度检查: ```bash # 1. 测试基础网络连接 ping -c 4 raw.githubusercontent.com # 2. 验证CA证书链(Ubuntu特有) ls /etc/ssl/certs | grep "ca-certificates.crt" # 应存在该文件 sudo update-ca-certificates --fresh # 3. 检查系统代理配置 env | grep -i proxy # 输出应为空 ``` --- ### ✅ 验证安装 ```bash # 列出已安装的GPG密钥 gpg --list-keys --keyring /usr/share/keyrings/ros-archive-keyring.gpg ``` 预期输出包含: `pub rsa4096 2020-05-23 [SC] [expires: 2025-05-22]` ` F42ED6FBAB17C654` --- ### 📌 永久修复建议 编辑`/etc/environment`添加GitHub IP映射: ```bash # 获取最新IP(需实时新) sudo sh -c "echo '$(dig +short raw.githubusercontent.com | tail -n1) raw.githubusercontent.com' >> /etc/hosts" ``` *效果*: $$ \text{Bypass DNS} \Rightarrow \text{减少SNI干扰} $$ ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值