1. 程式人生 > >【LeetCode 簡單題】100-壓縮字串

【LeetCode 簡單題】100-壓縮字串

宣告:

今天是第100道題。給定一組字元,使用原地演算法將其壓縮。壓縮後的長度必須始終小於或等於原陣列長度。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除

(手動比心ღ( ´・ᴗ・` ))

正文

題目:給定一組字元,使用原地演算法將其壓縮。壓縮後的長度必須始終小於或等於原陣列長度。陣列的每個元素應該是長度為1 的字元(不是 int 整數型別)。在完成原地修改輸入陣列後,返回陣列的新長度。

進階:
你能否僅使用O(1) 空間解決問題?

示例 1:

輸入:
["a","a","b","b","c","c","c"]

輸出:
返回6,輸入陣列的前6個字元應該是:["a","2","b","2","c","3"]

說明:
"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。

示例 2:

輸入:
["a"]

輸出:
返回1,輸入陣列的前1個字元應該是:["a"]

說明:
沒有任何字串被替代。

示例 3:

輸入:
["a","b","b","b","b","b","b","b","b","b","b","b","b"]

輸出:
返回4,輸入陣列的前4個字元應該是:["a","b","1","2"]。

說明:
由於字元"a"不重複,所以不會被壓縮。"bbbbbbbbbbbb"被“b12”替代。
注意每個數字在陣列中都有它自己的位置。

注意:

  1. 所有字元都有一個ASCII值在[35, 126]區間內。
  2. 1 <= len(chars) <= 1000

解法1。用cur指標指向當前chars需要插入的字元或數字的index,然後遍歷chars,原地修改,程式碼如下。

執行用時: 56 ms, 在String Compression的Python提交中擊敗了94.44% 的使用者

class Solution(object):
    def compress(self, chars):
        """
        :type chars: List[str]
        :rtype: int
        """
        i = 0
        chars_len = len(chars)
        cur = 0
        while i < chars_len:
            j = i
            while j < chars_len - 1 and chars[j] == chars[j+1]:
                j += 1
            chars[cur] = chars[i]
            cur += 1
            if i != j:
                times = str(j-i+1)
                times_len = len(times)
                for k in range(times_len):
                    chars[cur+k] = times[k]
                cur += times_len
            i = j+1
        return cur    # 
            

結尾

解法1:https://blog.csdn.net/androidchanhao/article/details/81408345