T1129 行程長度編碼

小傘是伯約呀發表於2020-12-08

描述
在資料壓縮中,一個常用的途徑是行程長度壓縮。對於一個待壓縮的字串而言,我們可以依次記錄每個字元及重複的次數。這種壓縮,對於相鄰資料重複較多的情況比較有效。 例如,如果待壓縮串為"AAABBBBCBB",則壓縮的結果是(A,3)(B,4)(C,1)(B,2)。當然,如果相鄰字元重複情況較少,則壓縮效率就較低。

現要求根據輸入的字串,得到大小寫不敏感壓縮後的結果(即所有小寫字母均視為相應的大寫字母)。

輸入
一個字串,長度大於0,且不超過1000,全部由大寫或小寫字母組成。
輸出
輸出為一行,表示壓縮結果,形式為:(A,3)(B,4)(C,1)(B,2)  即每對括號內部分別為字元(都為大寫)及重複出現的次數,不含任何空格。

樣例輸入

aAABBbBCCCaaaaa

樣例輸出

(A,3)(B,4)(C,3)(A,5)

解題思路:

遍歷字串,找到連續的相同字母(大小寫皆可),用結束位置的後一位減去開始位置,便是長度,輸出(該字母大寫,長度)即可,下面是程式碼實現

#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;

int main() {
    string a;
    cin >> a;
    int length = a.length();
    int i = 0 , j ;


    while(i != length ) {
        for(j = i; j < length; j++) {
            if(!(a[i] == a[j] || a[i] == a[j] - 32 || a[i] == a[j] + 32) || j == length)  {
                break;
            }
            else continue;
        }
        if(a[i] >= 'A' && a[i] <= 'Z')
        cout << "(" << char(a[i]) << ',' << j - i  << ")" ;
        else if(a[i] >= 'a' && a[i] <= 'z')
        cout << "(" << char(a[i]-32) << ',' << j - i  << ")" ;
        i = j;       
    }      
    return 0;
}

 

相關文章