HDU - 1274 展开字符串 递归

传送门


思路:数据量并不大, 我们只需模拟即可,分两种策略

  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;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值