传送门:https://www.luogu.com.cn/problem/P1928
再次感受到递归的魅力。
题目中的单次解压并不能太让人能感受到递归的思想,但对于多重解压,就是一层套一层的结构,先把最里层的解压后,再解压次里层。。。递归思想就出来了。
把框外的单词视为主串,框内的单词视为次串。那么主串的单词不需要解压,次串需要解压。此时对于这个去掉框的次串来说,它就是主串,而它的框内单词就是次串。。。
还有一点,C++的string真香
#include<iostream>
#include<cstring>
using namespace std;
string Read() {
char ch; int num;
string Smain="", Snext = "";
//这个Smain是[]外的字母,Snext是[]的字母
//别忘了初始化
while (cin >> ch) {
//循环读入
if (ch == '[') {
cin >> num;
//读入数字
Snext = Read();
//递归框内的字母
while (num > 0) { Smain += Snext; num--; }
//解压,把数字还原成字母
}
else if (isalpha(ch))Smain += ch;
//非框内字母直接加
else break;
//只要是]直接跳出循环
}
return Smain;
}
int main(void)
{
cout << Read();
return 0;//完结撒花
}