20分,
测试点一数据:
输入
[2[2[2NOTOMAMIKO]]]
输出
NOTOMAMIKONOTOMAMIKONOTOMAMIKONOTOMAMIKONOTOMAMIKONOTOMAMIKONOTOMAMIKONOTOMAMIKO
代码:
#include <bits/stdc++.h>
using namespace std;
char a[20005],b[20005];
int anowpot,bnowpot;
void dp(int ceng, int asta,int bsta) { //bsta表示要从该坐标开始重复操作
int renum = 0,coun = bsta; //renum表示要重复的次数,coun表示对b数组进行处理时的临时下标
for(int i = asta; i < strlen(a); i++) {
if(a[i] == '[') {
dp(ceng++, i+1,coun);
i = anowpot; coun = bnowpot; //递归完成后将在a遍历的i和在b遍历的coun赋值为最近一次递归完成后的值
}
else if(a[i] >= '0' && a[i] <= '9') {
int st = i,en = i,s = 1;
//处理两位以上的数字
while(a[i+1] >= '0' && a[i+1] <= '9') {
en++;
}
for(int j = en; j >= st; j--) {
renum += s*(a[j]-'0'); s*=10;
}
}
else if((a[i] >= 65 && a[i] <= 90) || (a[i] >= 97 && a[i] <= 122)) { //若为字母
b[coun] = a[i];coun++;
}
else if(a[i] == ']') { //检测到为']'则对b复制renum次后return
int t1 = bsta, t2 = coun;
//coun+=1;
for(int j = 1; j < renum; j++) {
for(int k = 0; k < t2-t1+1; k++) {b[coun] = b[t1+k];coun++;}
}
anowpot = i+1;bnowpot = coun;
return;
}
}
}
int main() {
cin>>a;
dp(1,0,0);
/*
for(int i = 0; i < 20000; i++) {
if(!(b[i] == 0 && b[i+1] == 0)) {
if(b[i] == 0) continue;
printf("%c", b[i]);
}
else break;
}
*/
printf("%s", b);
return 0;
}