算法练习 递归 外星密码问题

题目描述

有了防护伞,并不能完全避免 2012 的灾难。地球防卫小队决定去求助外星种族的帮 助。经过很长时间的努力,小队终于收到了外星生命的回信。但是外星人发过来的却是一 串密码。只有解开密码,才能知道外星人给的准确回复。解开密码的第一道工序就是解压 缩密码,外星人对于连续的若干个相同的子串“X”会压缩为“[DX]”的形式(D 是一个整 数且 1≤D≤99),比如说字符串“CBCBCBCB”就压缩为“[4CB]”或者“[2[2CB]]”,类 似于后面这种压缩之后再压缩的称为二重压缩。如果是“[2[2[2CB]]]”则是三重的。现 在我们给你外星人发送的密码,请你对其进行解压缩。

输入格式

第一行:一个字符串

输出格式

第一行:一个字符串

输入输出样例

输入 #1复制

AC[3FUN]

输出 #1复制

ACFUNFUNFUN

说明/提示

【数据范围】

对于 50%的数据:解压后的字符串长度在 1000 以内,最多只有三重压缩。

对于 100%的数据:解压后的字符串长度在 20000 以内,最多只有十重压缩。 对于 100%的数据:保证只包含数字、大写字母、’[‘和’]‘

 

 

分析:

- 此道题目并没有多少算法思想,考察的是递归的Coding能力(感觉有点像解析正则表达式,嘿嘿)

- 分析可知,每次出现  [   后,下一项必为数字,这便是突破口,递归便可以从此处写起。

- 由上一条,[ 与数字连在一起,剩余情况就只有] 和正常的字符串。分情况讨论,详情见代码

- 最后麻烦的是:必须得到每个[ 对应的 ] ,这里我采用了类似进栈出栈的操作,使用了一个变量que,来匹配到[所对应的]

- 详情见注释

#include <bits/stdc++.h>
using namespace std;

const long long MAX = 20005;
const int INF = 0x7fffffff;
char str[MAX];

void dfs(int index) {
    if(index==strlen(str)) return;    //先写边界
    if(str[index]=='[') {            //第一种情况
        index++;
        int num = 0;
        while (isdigit(str[index])) {
            num = num*10 + str[index]-'0';
            index++;
        }
        for (int i = 0; i < num; ++i) {
            dfs(index);
        }
        
        int que = 1;    //由于现在在[]中,[的数量所以为1
        while(que) {
            if(str[index]=='[') que++;
            else if (str[index]==']') que--;
            index++;
        }
        dfs(index);  //如果没有这一步,递归将在第一个[对应的]处停止。这也是为什么要找]的原因
    } else if(str[index]==']') {
        return;
    } else {
        //最后一种情况:是正常的数据
        while (isalpha(str[index])) {
            printf("%c",str[index]);
            index++;
        }
        dfs(index);
    }
}


int main() {
    scanf("%s",str);
    dfs(0);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章