一、題目介紹
字符串壓縮。利用字符重複出現的次數,編寫一種方法,實現基本的字符串壓縮功能。比如,字符串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);
}
};