付費限定

字串壓縮 String Compression_Leetcode 精選75題

更新於 2024/08/18閱讀時間約 6 分鐘

題目敘述

題目會給我們一個輸入陣列chars,要求我們把同樣的字元作分類並且依照長度做編碼壓縮。壓縮時,必須在陣列做in-place原地更新,最後回傳壓縮之後的字串長度。

壓縮規則:

同樣的字元一群,首項放字元,假如這群的長度只有1,那這群的壓縮就完成了。假如假如這群的長度大於1,那麼後面緊接著以字元的形式,放入這群的長度。

例如輸入['a','a','a'] 壓縮完變成['a','3'] 長度為2

例如輸入['a','b'] 壓縮完變成['a','b'] 長度為2

題目的原文敘述


測試範例

Example 1:

Input: chars = ["a","a","b","b","c","c","c"]
Output: Return 6, and the first 6 characters of the input array should be: ["a","2","b","2","c","3"]
Explanation: The groups are "aa", "bb", and "ccc". This compresses to "a2b2c3".

Example 2:

Input: chars = ["a"]
Output: Return 1, and the first character of the input array should be: ["a"]
Explanation: The only group is "a", which remains uncompressed since it's a single character.

Example 3:

Input: chars = ["a","b","b","b","b","b","b","b","b","b","b","b","b"]
Output: Return 4, and the first 4 characters of the input array should be: ["a","b","1","2"].
Explanation: The groups are "a" and "bbbbbbbbbbbb". This compresses to "ab12".

約束條件

  • 1 <= chars.length <= 2000

輸入陣列chars的長度介於1~2000之間

  • chars[i] is a lowercase English letter, uppercase English letter, digit, or symbol.

chars內不包含的只會是大寫英文字母、小寫英文字母、數字、或者符號。


演算法

這邊可以使用經典的雙指針來解。

宣告兩個變數,slow和fast,初始化為零,代表起頭位置。

從左邊開始向右掃描每一群slow負責壓縮後對應要填的位置fast負責去量測同一群字元的長度,並且紀錄在計數器count裡面


程式碼

class Solution:
def compress(self, chars: List[str]) -> int:
slow, fast = 0, 0
n = len(chars)

while fast < n:

# Update leading character
chars[slow] = chars[fast]
count = 1

# Measure the length of cluster with same character
while (fast + 1) < n and chars[fast] == chars[fast+1]:
fast += 1
count += 1

# Write length of current cluster
if count > 1:
for c in str(count):
chars[slow+1] = c
slow += 1

# Moving to right hand side
fast += 1
slow += 1

return slow
以行動支持創作者!付費即可解鎖
本篇內容共 2487 字、1 則留言,僅發佈於Leetcode精選75題 解析+統整你目前無法檢視以下內容,可能因為尚未登入,或沒有該房間的查看權限。
avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給我們一個輸入字串s,題目還保證字串s的長度一定是偶數。 要求我們判定字串s的前半部和後半部是否相似? 在本題中,兩個字串相似的定義為兩個字串都擁有相同的母音英文字母: 註: 母音英文字母為a, e, i, o, u, A, E, I, O, U 題目的原文敘述 測試
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 問我們任意祖先節點和晚輩節點之間,最大的差值的絕對值是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [8,3,10,1,6,null,14,null,null,4,7,13] Ou
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
題目敘述 題目會給我們一個整數陣列,裡面包含各種正整數,每回合可以消去兩個相同的數字,或者消去三個相同的數字。問最少需要幾次消去,才能讓陣列為空? 如果無解,則返回-1 詳細的題目可在這裡看到 測試範例 Example 1: Input: nums = [2,3,3,2,2,4,2,3,
題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key Table:
題目敘述 題目會給我們一個輸入字串s,題目還保證字串s的長度一定是偶數。 要求我們判定字串s的前半部和後半部是否相似? 在本題中,兩個字串相似的定義為兩個字串都擁有相同的母音英文字母: 註: 母音英文字母為a, e, i, o, u, A, E, I, O, U 題目的原文敘述 測試
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 問我們任意祖先節點和晚輩節點之間,最大的差值的絕對值是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [8,3,10,1,6,null,14,null,null,4,7,13] Ou
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
題目敘述 題目會給我們一個整數陣列,裡面包含各種正整數,每回合可以消去兩個相同的數字,或者消去三個相同的數字。問最少需要幾次消去,才能讓陣列為空? 如果無解,則返回-1 詳細的題目可在這裡看到 測試範例 Example 1: Input: nums = [2,3,3,2,2,4,2,3,
題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key Table:
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
由於遇到系統不支援歐洲語系的重音符號或變音符號因此有了這篇文章
Thumbnail
在這篇教學中,我們將學習如何在C#程式碼中使用字串插值來加入變數。字串插值是一種方便且易讀的方式,讓我們可以將變數值插入到字串中,而不必使用傳統的串接方法。現在,讓我們開始吧! 在這個範例中,我們將創建一個簡單的應用程式,使用字串插值在螢幕上顯示一條個人訊息。這個訊息包含姓名、年齡和城市。 us
Thumbnail
歡迎回到我的學習筆記,今天我想分享一下在python中幾個反轉字串的作法,反轉字串的意思就像是將文字從「我愛你」變成「你愛我」。 談到反轉字串時,有幾種不同的方法,寫法如下: 以下反轉字串是寫成函式的樣子 1. 使用迴圈: 這是一個傳統的方法,使用迴圈來反轉字串。
在Python中,join()和split()是用於處理字串的切割與組合的方法。
參考 : https://www.w3school.com.cn/jsref/jsref_replace.ASP 取代字串方式 取代找到的第一個 全取代 str.replace(/原始字詞/g, '新字詞');
Thumbnail
工作上臨時需要,去搜尋了各類文章,但concat函數excel好像會有版本限制,我用公式臨時調不出想要的結果...... 需求:移除重複欄位、把各欄位的內容用逗號(,)做連接 方法:找到移除重複的功能按鈕、使用&連接、使用excel的自動填滿功能
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
由於遇到系統不支援歐洲語系的重音符號或變音符號因此有了這篇文章
Thumbnail
在這篇教學中,我們將學習如何在C#程式碼中使用字串插值來加入變數。字串插值是一種方便且易讀的方式,讓我們可以將變數值插入到字串中,而不必使用傳統的串接方法。現在,讓我們開始吧! 在這個範例中,我們將創建一個簡單的應用程式,使用字串插值在螢幕上顯示一條個人訊息。這個訊息包含姓名、年齡和城市。 us
Thumbnail
歡迎回到我的學習筆記,今天我想分享一下在python中幾個反轉字串的作法,反轉字串的意思就像是將文字從「我愛你」變成「你愛我」。 談到反轉字串時,有幾種不同的方法,寫法如下: 以下反轉字串是寫成函式的樣子 1. 使用迴圈: 這是一個傳統的方法,使用迴圈來反轉字串。
在Python中,join()和split()是用於處理字串的切割與組合的方法。
參考 : https://www.w3school.com.cn/jsref/jsref_replace.ASP 取代字串方式 取代找到的第一個 全取代 str.replace(/原始字詞/g, '新字詞');
Thumbnail
工作上臨時需要,去搜尋了各類文章,但concat函數excel好像會有版本限制,我用公式臨時調不出想要的結果...... 需求:移除重複欄位、把各欄位的內容用逗號(,)做連接 方法:找到移除重複的功能按鈕、使用&連接、使用excel的自動填滿功能