我看到网上的题解部分都是C++,有C语言的题解也没法全AC,这道题自己写起来还是比较复杂的。
思路:
这是一道经典的递归题目,大致方法为没遇到一个左括号 ‘ [ ’ 就递归一次。整体难度还是不大的,就是要处理好一些细节方面的问题,并计算字符串的标记处。
(没听懂的可以去看看c++题解的文章,写的非常详细,这里仅是使用C语言写出的题解)
不啰嗦,直接上代码吧。
#include <stdio.h>
#include <string.h>
char arr[20001];//存放初始数组
char end[20001];//存放答案
int begin=0;//定义end的长度,用于存入操作
void ikun(char arr[])
{
int len=strlen(arr);
int i,j;
for(i=0;i<len;i++)
{
if(arr[i]!='[')//判断递归的条件
{
end[begin]=arr[i];//正常情况直接粘贴到数组end中去
begin++;
}
else
{
i++;//不正常情况把arr位置后移一格
int t=arr[i]-48;
if(arr[i+1]<='9'&&arr[i+1]>='0')
{
t=t*10+arr[i+1]-48;//记录反复输出的次数到参数t
i++;
}
int mark_kuohao=1;//标记括号数目(奇数为不合格,偶数可以输出)
int mark_num=0;
char num[20001];
memset(num,0,sizeof num);//初始化num字符串
for(j=i+1;j<len;j++)
{
if(arr[j]=='[')mark_kuohao++;
if(arr[j]==']')mark_kuohao--;// 计算括号是否配对
if(mark_kuohao==0)break;//直到到达其对应的右括号中退出
num[mark_num]=arr[j];//复制括号内的所有字符串到num
mark_num++;
}
int len_num=strlen(num);//计算num的长度用于计算递归后返回的位置
int k;
for(k=0;k<t;k++)
{
ikun(num);//递归:对应t次数的for循环
}
//递归重括号内的字符串新处理
i+=len_num+1;
//标记返还递归后的位置
memset(num,0,sizeof num);
//初始化num数组
}
}
return;
}
int main()
{
int i,j;
scanf("%s",&arr);
ikun(arr);//主函数没什么好说的
printf("%s",end);
return 0;
}
写了三天了,终于过了,太不容易了!
-____-"
唉~別提写代码的过程了.....(难绷啊)
思路仅供参考,不是最优解法