(1)可以百度到一种“替换法”,相对比较简单,由于反复遍历,速度略慢于递归法
(2)比替换法理解难度略大
解题思路:题目出现了括号对(栈结构?),括号对内数据可能是重复的,重复的特征是:数字+‘|’。那么容易想到碰见左括号就进栈,右括号出栈,期间做点什么事情。问题在于,此题目情况较多,如果用栈写起来会比较繁琐。
用递归就简单多了,递归通过参数传递和全局变量在条件处理上具备优势,另外,括号嵌套用递归写也是一种常见的处理方法。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
string s;
string dfs(int &l) /**< 递归处理第l个字符 */
{ /**< 阅读时用数据 HG[3|B[2|CA]]F辅助理解 */
int i,j,k,sum=0;
string ans="",temp="";
if(isdigit(s[l])) /**< 是数字,拿出完整值,例如是3,后面的数据要重复3次 */
{
while(isdigit(s[l]))
sum=sum*10+s[l++]-'0';
l++;/**< 这个++作用是跳过数字后面的 '|' */
}
for(;l<s.size()&&s[l]!=']';l++) /**< 一直处理到']'或者是最后 */
{
if(s[l]=='[') /**< 左括号递归到下一层 */
l++,ans+=dfs(l);
else
ans+=s[l];/**< 不是括号也不是数字,那么s[l]是字母,先存起来 */
}
if(sum==0) sum=1;
while(sum--) temp+=ans;/**< 重复,如果sum为0说明没有数字,哪也要复制一份给temp */
return temp;
}
int main()
{
int i=0;/**< 注意函数采用c++ &引用的方式使用这个i,这个i值全程都在函数中变化 */
cin>>s;
cout<<dfs(i);
return 0;
}