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