P1928 外星密码

41 篇文章 0 订阅
22 篇文章 0 订阅

😊😊 😊😊
不求点赞,只求耐心看完,指出您的疑惑和写的不好的地方,谢谢您。本人会及时更正感谢。希望看完后能帮助您理解算法的本质
😊😊 😊😊

题目描述:

小白到进阶各种解法:

一、暴搜:😊

在这里插入图片描述

思路:递归

本题可以将一个字符串分为三种情况进行讨论:

  1. 当前字符为 ′ [ ′ '[' [,则下一个必为数字,说明进入到了压缩的部分,需要我们解压缩,在输入数字 c n t cnt cnt之后,将解压缩的部分累计 c n t cnt cnt 次!
  2. 当前字符为字符: A   Z 部分 A~Z部分 A Z部分,则直接统计当前字符到字符串里面。
  3. 若为 ′ ] ′ ']' ]:则此时说明解压缩完毕,将当前字符串进行返回!返回后赋值 c n t cnt cnt 次给解码前的字符串!

代码:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

string dfs()
{
    string str = "", back = ""; //back是负责存储拼接字符的!
    char ch;    //为每次读入的字符

    while (cin >> ch)
    {
        if (ch == '\n') //说明字符串已经读入完毕了!
            break;

        if (ch == '[')  //处理当前字符串!
        {
            int t;
            cin >> t;   //下一个字符必然是数字!
            str = dfs();    //解码压缩部分!    
            while (t --)
                back += str;  //则将压缩的字符进行解码t次。并赋值给back!
        }
        else if (ch == ']') return back; 
        else //否则最后一种情况就是字母了!
            back += ch;
    }
}

int main()
{
    cout << dfs();
    return 0;
}

在这里插入图片描述

二、模拟:

思路:

  1. 读入整个字符串以后,寻找压缩部分的字符。
  2. 从右往左找,找到的第一个字符: ’ [ ‘ ’[‘ [ 必然为压缩部分的最内层的压缩!可以自己画图模拟看看。那么我们要做的就是解码最内层的压缩部分。一层一层剖开!记录当前所找的 字符: [ 字符 :[ 字符:[ 的下标为: l l l;那么怎么剖开呢?
  3. 我们还差一个下标,即与之对应的字符: ′ ] ′ ']' ],记该字符的下标为: r r r;然后将区间: [ l , r ] [l, r] [l,r] 里面的进行解码。
  4. 字符 [ [ [ 的后一个字符必为数字字符,那么我们可以将其取出来,然后转化为数字: c n t cnt cnt,然后将整个压缩部分进行 c n t cnt cnt 次累计!

其实我们从左往右找到的第一个字符: [ [ [,是最内层的压缩部分。而同样,我们可以同时累计字符: ] ] ],它也同样是最内层的部分,可能累计途中我们会遇到多个 ′ ] ′ ']' ],但是一路不断更新 r r r 下去,直到遇到 字符: [ [ [,而最后一次统计的 ] ] ],必然是最内层的。 [ 和 ] [ 和 ] [] 两个字符分别会遇到一次和多次!

代码:未完善!

#include<iostream>

using namespace std;

int main()
{
    string str;
    cin >> str;

    while (true)
    {
        int l=-1, r=-1;
        int len = str.size();
        
        for (int i=len-1; i>=0; i --)
        {
            if (str[i] == ']') r = i;
            if (str[i] == '[') 
            {
                l = i;
                break;
            }
        }
        
        if (l == -1) break;

        //l 后面的字符必然是:数字字符,取出该字符,因为我们需要利用到它!
        //将其转坏为数字字符!
        int cnt = str[l+1] - '0';
        for (int i=0; i < cnt; i ++)    //赋值cnt次!
            str[l]
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值