思路:数据量并不大, 我们只需模拟即可,分两种策略
step1 : 如果是数字, 代表需要循环输出, 此时又分两种策略
1:如果后面是“(”, 则需要循环一个字符串, 即递归即可
2:如果后面是单个字母, 只需把后面的一个字母循环输出多次即可。
step2:如果是字母, 直接输出
也就是说我们写的函数就是要输出后面字符串需要的次数,如果碰到了数字, 我们循环几次这个函数即可, 这就需要我们知道从哪个地方开始输出, 而且这个函数结束之后我们要知道已经进行到哪里了。因为后面的循环了之后,不需要再找了, 已经循环输出了。
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
string ss;
int fun(int x)
{
char ch;
int k;
for(ch = ss[x++]; ch != ')' && x < ss.size(); ch = ss[x++]) //如果碰到“)”, 直接返回即可, 此时没有等待返回值的情况,不需要返回值
{
for(k = 0; ch <= '9' && ch >= '0'; ch = ss[x++]) k = k*10 + ch - '0'; //把数字找出来, 可能不止一位
if(!k) k = 1; // 如果前面没有数字,证明只需要输出一次, 覆盖成1
if(ch == '(')
{
int tmp;
while(k--)
tmp = fun(x);
x = tmp; //更新x的值, 因为之前的已经解决了(循环输出了), 直接在后面继续即可
}
else while(k--) putchar(ch);
}
if(ch == ')') return x; //如果是“)”, 说明上一层函数的tmp在等待返回值, 我们需要返回当前输出到哪里了
}
int main()
{
int N;
cin >> N;
while(N--)
{
cin >> ss;
fun(0);
puts("");
}
return 0;
}