443. 压缩字符串
443. 壓縮字符串
給你一個字符數組 chars ,請使用下述算法壓縮:
從一個空字符串 s 開始。對于 chars 中的每組 連續重復字符 :
如果這一組長度為 1 ,則將字符追加到 s 中。
否則,需要向 s 追加字符,后跟這一組的長度。
壓縮后得到的字符串 s 不應該直接返回 ,需要轉儲到字符數組 chars 中。需要注意的是,如果組長度為 10 或 10 以上,則在 chars 數組中會被拆分為多個字符。
請在 修改完輸入數組后 ,返回該數組的新長度。
你必須設計并實現一個只使用常量額外空間的算法來解決此問題。
示例 1:
輸入:chars = [“a”,“a”,“b”,“b”,“c”,“c”,“c”]
輸出:返回 6 ,輸入數組的前 6 個字符應該是:[“a”,“2”,“b”,“2”,“c”,“3”]
解釋:
“aa” 被 “a2” 替代。“bb” 被 “b2” 替代。“ccc” 被 “c3” 替代。
示例 2:
輸入:chars = [“a”]
輸出:返回 1 ,輸入數組的前 1 個字符應該是:[“a”]
解釋:
沒有任何字符串被替代。
示例 3:
輸入:chars = [“a”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”]
輸出:返回 4 ,輸入數組的前 4 個字符應該是:[“a”,“b”,“1”,“2”]。
解釋:
由于字符 “a” 不重復,所以不會被壓縮。“bbbbbbbbbbbb” 被 “b12” 替代。
注意每個數字在數組中都有它自己的位置。
提示:
1 <= chars.length <= 2000
chars[i] 可以是小寫英文字母、大寫英文字母、數字或符號
解題思路
遍歷字符數組,找出連續字符的出現次數
難點在于,我們需要將出現次數切割為字符,重新寫入字符數組中。我們可以維護一個一個寫指針
首先需要將連續字符寫入,如果字符出現的次數大于一的情況下,我們就需要拆分出現次數,寫入數組,每個字符的寫入都將寫指針后移
最后返回寫指針所在的位置
代碼
class Solution {public int compress(char[] chars) {char pre=chars[0],cnt=1,w=1;for (int i = 1; i < chars.length; i++) {if (chars[i]==pre){cnt++;}else {if(cnt>1){int old=w;while (cnt>0) {chars[w++] = (char)('0'+ cnt%10);cnt/=10;}for (int l=old,r=w-1;l<r;l++,r--){char c=chars[l];chars[l]=chars[r];chars[r]=c;}}cnt=1;pre=chars[i];chars[w++]=pre;}}if(cnt>1){int old=w;while (cnt>0) {chars[w++] = (char)('0'+ cnt%10);cnt/=10;}for (int l=old,r=w-1;l<r;l++,r--){char c=chars[l];chars[l]=chars[r];chars[r]=c;}}return w;} }總結
以上是生活随笔為你收集整理的443. 压缩字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 552. 学生出勤记录 II
- 下一篇: 670. 最大交换