算法練習 遞歸 外星密碼問題

題目描述

有了防護傘,並不能完全避免 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);
}

 

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