18941 压缩算法

这篇博客介绍了一种使用递归算法处理包含括号和数字的字符串的方法。作者指出,相较于替换法,递归法在处理括号嵌套时更为简洁。代码示例展示了如何遍历字符串,遇到数字则读取重复次数,遇到左括号进行递归,最后根据重复次数生成结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值