递归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;
} 

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

猜你喜欢

转载自blog.csdn.net/SSL_wyd/article/details/114291044