題目地址:https://leetcode-cn.com/problems/compress-string-lcci/
題目描述
字符串壓縮。利用字符重復出現的次數,編寫一種方法,實現基本的字符串壓縮功能。比如,字符串aabcccccaaa會變為a2b1c5a3。若“壓縮”后的字符串沒有變短,則返回原先的字符串。你可以假設字符串中只包含大小寫英文字母(a至z)
題目示例
示例1:
輸入:"aabcccccaaa"
輸出:"a2b1c5a3"
示例2:
輸入:"abbccd"
輸出:"abbccd"
解釋:"abbccd"壓縮后為"a1b2c2d1",比原字符串長度更長。
提示:字符串長度在[0, 50000]范圍內。
解題思路
思路1:分析題目可知,字符串壓縮即將連續出現的相同字符按照 “字符 + 出現次數 ”壓縮。
約束條件是如果壓縮后的字符串長度變短,則返回壓縮后的字符串,否則保留原來的字符串。
具體步驟如下:
- 使用字符c記錄當前要壓縮的字符,變量cnt記錄字符c出現的次數
- 利用for循環枚舉字符串S中的字符,若當前枚舉到的字符S[i]==c,則計數器cnt加1,否則,按照字符串壓縮方式“字符 + 出現次數 ”輸出,並更新當前要壓縮的字符c和計數器cnt
- 遍歷結束之后,按照題目要求將壓縮后的字符res長度與原串長度進行比較,若其長度沒有變短,即大於等於原字符串S的長度,則返回原字符串S,否則返回壓縮后的字符串res。
思路2:雙指針大法
我們使用雙指針i和j,其中指針j向前移動,指針i用於標記相同字符出現的最后一個元素的下一個。
程序源碼
思路1
class Solution { public: string compressString(string S) { if(S.size() < 1) return S; int cnt = 1; string res; char c = S[0]; for(int i = 1; i < S.size(); i++) { if(c == S[i]) { cnt++; } else { res += c + to_string(cnt); c = S[i]; cnt = 1; } } res += c + to_string(cnt); return res.length() >= S.length()? S: res; } };
思路2:
class Solution { public: string compressString(string S) { if(S.size() == 0) return S; string res; int i = 0; while(i < S.size()) { int j = i; while(j < S.size() && S[j] == S[i]) { j++; } res += S[i]; res += to_string(j - i); i = j; } return res.size() >= S.size() ? S: res; } };
參考文章