[LeetCode解題攻略] 38. Count and Say

更新於 發佈於 閱讀時間約 7 分鐘

問題描述

Count-and-say序列是透過遞歸公式定義的數字串序列:

countAndSay(1) = "1"

countAndSay(n)countAndSay(n - 1) 的Run-length encoding。

Run-length encoding (RLE) 是一種字串壓縮方法,其工作原理是將連續相同的字元(重複 2 次或更多次)替換為字元和標記字元數(length of the run)的數字的連接。例如,為了壓縮字串“3322251”,我們用“23”替換“33”,用“32”替換“222”,用“15”替換“5”,用“11”替換“1”。因此壓縮後的字串變成「23321511」。

給定一個正整數 n,傳回count-and-say序列的第 n 個元素。


範例 1

輸入:n = 1
輸出:"1"
解釋:第一項是 "1"

範例 2

輸入:n = 4
輸出:"1211"
解釋:
1 項是 "1"
2 項是 "11"11)。
3 項是 "21"21)。
4 項是 "1211"1211)。

解題思路

該題的本質是一個遞推問題,從 n = 1 開始,不斷基於前一項生成新的數列。

  • 關鍵點
    1. 如何描述一個數列?從左到右依次統計連續的相同數字出現的次數,然後生成描述字符串。
    2. 每一項都依賴於前一項,因此需要迭代生成。
  • 解題策略
    1. 使用字符串保存當前數列的描述。
    2. 遍歷該字符串,統計每個數字連續出現的次數,然後生成新的字符串。
    3. 重複上述過程,直到生成第 n 項。

解法一:模擬法

思路

  • 從第一項開始,依次生成每一項。
  • 使用一個輔助函數來根據前一項生成當前項。

程式碼

class Solution:
def countAndSay(self, n: int) -> str:
def next_sequence(s):
result = []
count = 1
for i in range(1, len(s)):
if s[i] == s[i - 1]:
count += 1
else:
result.append(str(count))
result.append(s[i - 1])
count = 1
result.append(str(count))
result.append(s[-1])
return ''.join(result)

sequence = "1"
for _ in range(n - 1):
sequence = next_sequence(sequence)
return sequence

解釋

  1. 輔助函數 next_sequence
    • 用於生成下一項數列。
    • 遍歷當前字符串,統計連續數字的次數,並將結果保存為新的字符串。
    • 時間複雜度為 O(k),其中 k 是當前字符串的長度。
  2. 主函數 countAndSay
    • 初始數列為 "1"。
    • 不斷調用 next_sequence,生成第 n 項。

時間與空間複雜度

  • 時間複雜度:O(m),其中 m 是所有數列總長度。
    • 每次生成的數列長度與前一項成線性增長,總計約為 O(2^n)。
  • 空間複雜度:O(k),其中 k 是當前字符串的長度。

解法二:遞歸法

思路

  • 使用遞歸的方法生成第 n 項。
  • 基於第 n-1 項,統計每個數字的出現次數,生成新的字符串。

程式碼

class Solution:
def countAndSay(self, n: int) -> str:
if n == 1:
return "1"

prev_sequence = self.countAndSay(n - 1)
result = []
count = 1

for i in range(1, len(prev_sequence)):
if prev_sequence[i] == prev_sequence[i - 1]:
count += 1
else:
result.append(str(count))
result.append(prev_sequence[i - 1])
count = 1
result.append(str(count))
result.append(prev_sequence[-1])
return ''.join(result)

解釋

  1. 基底條件
    • 當 n = 1 時,返回 "1"。
  2. 遞歸步驟
    • 基於第 n-1 項進行數字統計,生成當前項。

時間與空間複雜度

  • 時間複雜度:O(m),同樣為所有數列總長度。
  • 空間複雜度:O(n),因為遞歸需要額外的棧空間。

結論

  • 解法一 模擬法通過迭代生成每一項,便於理解與實現。
  • 解法二 遞歸法更加直觀,但需要注意遞歸深度的限制。
  • 雖然該問題的本質是模擬與遞推,但隨著 n 增大,生成數列的時間與空間消耗將指數增長,因此需要合理處理大輸入的情況。
留言
avatar-img
留言分享你的想法!
avatar-img
追極光的北極熊|軟體工程師的小天地
9會員
158內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/04/04
給定一個非負整數陣列 nums,其中 nums[i] 代表你在索引 i 處最多可以向右跳幾步。 請判斷是否能夠從索引 0 跳到最後一個索引。
2025/04/04
給定一個非負整數陣列 nums,其中 nums[i] 代表你在索引 i 處最多可以向右跳幾步。 請判斷是否能夠從索引 0 跳到最後一個索引。
2025/03/28
給定一個 m x n 的矩陣 matrix,請按照 螺旋順序(spiral order) 返回矩陣中的所有元素。
2025/03/28
給定一個 m x n 的矩陣 matrix,請按照 螺旋順序(spiral order) 返回矩陣中的所有元素。
2025/03/20
這道題是 LeetCode 的經典題之一,要求我們找出 一個子陣列,使其和最大,並返回這個最大和的數值。
2025/03/20
這道題是 LeetCode 的經典題之一,要求我們找出 一個子陣列,使其和最大,並返回這個最大和的數值。
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
題目敘述 386. Lexicographical Numbers 給定一個數字n,請實作一個字典序(Lexical order)排列的報數機, 依字典序輸出所有1~n的數字。 你必須實現一個O(n) time線性時間,O(1) extra space常數額外空間的演算法。
Thumbnail
題目敘述 386. Lexicographical Numbers 給定一個數字n,請實作一個字典序(Lexical order)排列的報數機, 依字典序輸出所有1~n的數字。 你必須實現一個O(n) time線性時間,O(1) extra space常數額外空間的演算法。
Thumbnail
Append Characters to String to Make Subsequence 給定兩個字串s和字串t。 請計算最少的字元串接數量是多少,串接在s的尾端,使得t是s的子序列。 測試範例 Example 1: Input: s = "coaching", t =
Thumbnail
Append Characters to String to Make Subsequence 給定兩個字串s和字串t。 請計算最少的字元串接數量是多少,串接在s的尾端,使得t是s的子序列。 測試範例 Example 1: Input: s = "coaching", t =
Thumbnail
題目敘述 題目會告訴我們一組英文和數字之間的轉換編碼規則,還有一個輸入字串s,問我總共有多少合法的解碼方式? 要特別留意,輸入字串可能包含有leading zero,導致無法解碼。 轉換規則如下: A <-> 1 B <-> 2 C <-> 3 ... Z <-> 26 詳細的題
Thumbnail
題目敘述 題目會告訴我們一組英文和數字之間的轉換編碼規則,還有一個輸入字串s,問我總共有多少合法的解碼方式? 要特別留意,輸入字串可能包含有leading zero,導致無法解碼。 轉換規則如下: A <-> 1 B <-> 2 C <-> 3 ... Z <-> 26 詳細的題
Thumbnail
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
Thumbnail
題目敘述 題目會給我們一個陣列,要求我們返回 兩數之和=target所在的陣列索引值。 題目還額外保證,一定剛好有一組解。 測試範例 Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1]
Thumbnail
題目會給我們一個字串陣列nums,內容都是二進位字串,要求我們造出一個另一個相等長度,新的二進位字串,而且不和字串陣列nums內的重複。 答案可能有不只一組,回傳合任一組合法的答案皆可。
Thumbnail
題目會給我們一個字串陣列nums,內容都是二進位字串,要求我們造出一個另一個相等長度,新的二進位字串,而且不和字串陣列nums內的重複。 答案可能有不只一組,回傳合任一組合法的答案皆可。
Thumbnail
老是從頭重算可不是好法子,把加過的累積值存起來備用,這才符合 Prefix Sum 的精神!
Thumbnail
老是從頭重算可不是好法子,把加過的累積值存起來備用,這才符合 Prefix Sum 的精神!
Thumbnail
題目給定一個規律變化的二進位字串,問我們第N排,第K個bit是多少? 變化的規律: 上一排的0到下一排展開成01,上一排的1到下一排展開成10 第一排初始化是0 第二排是01 第三排是0110 第四排是01101001 ...其餘依此類推 詳細的題目可在這裡看到
Thumbnail
題目給定一個規律變化的二進位字串,問我們第N排,第K個bit是多少? 變化的規律: 上一排的0到下一排展開成01,上一排的1到下一排展開成10 第一排初始化是0 第二排是01 第三排是0110 第四排是01101001 ...其餘依此類推 詳細的題目可在這裡看到
Thumbnail
題目:給定一個由 1 和 0 組成的數組,將等效的二進位值轉換為整數。 例如:[0, 0, 0, 1] 被視為 0001,即 1 的二進位表示法。
Thumbnail
題目:給定一個由 1 和 0 組成的數組,將等效的二進位值轉換為整數。 例如:[0, 0, 0, 1] 被視為 0001,即 1 的二進位表示法。
Thumbnail
題目:你的團隊正在開發一個新的高級文本編輯器,你的任務是實現行號功能。請編寫一個函數,該函數接受一個字符串列表作為輸入,並返回每行字符串前面附帶正確的行號。行號從 1 開始計數。格式為 n: 字符串。請注意冒號和空格之間的間隔。
Thumbnail
題目:你的團隊正在開發一個新的高級文本編輯器,你的任務是實現行號功能。請編寫一個函數,該函數接受一個字符串列表作為輸入,並返回每行字符串前面附帶正確的行號。行號從 1 開始計數。格式為 n: 字符串。請注意冒號和空格之間的間隔。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News