文本壓縮有很多種方法,這里我們只考慮最簡單的一種:把由相同字符組成的一個連續的片段用這個字符和片段中含有這個字符的個數來表示。例如?ccccc
?就用?5c
?來表示。如果字符沒有重復,就原樣輸出。例如?aba
?壓縮后仍然是?aba
。
解壓方法就是反過來,把形如?5c
?這樣的表示恢復為?ccccc
。
本題需要你根據壓縮或解壓的要求,對給定字符串進行處理。這里我們簡單地假設原始字符串是完全由英文字母和空格組成的非空字符串。
輸入格式:
輸入第一行給出一個字符,如果是?C
?就表示下面的字符串需要被壓縮;如果是?D
?就表示下面的字符串需要被解壓。第二行給出需要被壓縮或解壓的不超過 1000 個字符的字符串,以回車結尾。題目保證字符重復個數在整型范圍內,且輸出文件不超過 1MB。
輸出格式:
根據要求壓縮或解壓字符串,并在一行中輸出結果。
輸入樣例 1:
C
TTTTThhiiiis isssss a tesssst CAaaa as
輸出樣例 1:
5T2h4is i5s a3 te4st CA3a as
輸入樣例 2:
D
5T2h4is i5s a3 te4st CA3a as10Z
輸出樣例 2:
TTTTThhiiiis isssss a tesssst CAaaa asZZZZZZZZZZ
#include<iostream> using namespace std; string s;void compress(){getline(cin,s);for(int i = 0; i < s.length(); i++){int cnt = 0;while(s[i] == s[i+1]){cnt++;i++;}if(cnt != 0) cout << cnt+1;cout << s[i];} }void depress(){getline(cin,s);for(int i = 0; i < s.length(); i++){int sum = 0; while(s[i] <= '9' && s[i] >= '0')sum = sum * 10 + s[i++] - '0';for(int j = 0; j < sum; j++)cout <<s[i];if(sum == 0) cout << s[i];} }int main(){char c;cin >> c;getchar();if(c == 'C') compress();else depress();return 0; }
?