程序員面試金典——面試題01.06.字符串壓縮

一、題目介紹

字符串壓縮。利用字符重複出現的次數,編寫一種方法,實現基本的字符串壓縮功能。比如,字符串aabcccccaaa會變爲a2b1c5a3。若“壓縮”後的字符串沒有變短,則返回原先的字符串。你可以假設字符串中只包含大小寫英文字母(a至z)。

示例1:

 輸入:"aabcccccaaa"
 輸出:"a2b1c5a3"
示例2:

 輸入:"abbccd"
 輸出:"abbccd"
 解釋:"abbccd"壓縮後爲"a1b2c2d1",比原字符串長度更長。
提示:

字符串長度在[0, 50000]範圍內。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/compress-string-lcci
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

二、解題思路

        字符串壓縮的方式就是將連續出現的相同字符按照 字符 + 出現次數 壓縮。如果壓縮後的字符串長度變短,則返回壓縮後的字符串,否則保留原來的字符串。

        本題如果使用string類型的對象很容易實現,即按照壓縮方式將給定字符串壓縮,最後再比較壓縮前後字符串的長度,返回長度較短的字符串即可。爲了避免string對象隨着長度不斷增加,而帶來的存儲空間的再分配和複製的問題,可以動態申請固定長度的動態數組來完成上述過程。

三、解題代碼

class Solution {
public:
    string compressString(string S) {
        int i = 0, j = 0;
        int len = S.size();
        if(len <= 2)
            return S;
        char *s = new char[len+5]; //因爲字符長度最大是50000,即5位數
        char ch = S[0];
        int count = 1;
        for(i = 1; i <= len; ++i)
        {
            if(S[i] == ch)
                ++count;
            else if(S[i] != ch && j < len)
            {
                //壓縮之前的字符
                s[j++] = ch;
                string str = to_string(count); //數字轉成字符串
                for(int k = 0; k < str.size(); ++k)
                {
                    s[j++] = str[k]; 
                }
                if(j >= len)
                    return S;
                //記錄下一個字符
                ch = S[i];
                count = 1;
            }   
        }
        s[j] = '\0';
        return string(s);
    }
};

四、解題結果

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