」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > LeetCode 冥想:解碼方法

LeetCode 冥想:解碼方法

發佈於2024-08-01
瀏覽:776

LeetCode Meditations: Decode Ways

我們先來描述這個問題:

您截獲了一條編碼為數字字串的秘密訊息。該訊息透過以下映射進行解碼

“1”->“A”“2”->“B”...“25”->“Y”“26”->“Z”

但是,在解碼訊息時,您意識到可以透過多種不同的方式解碼訊息,因為某些程式碼包含在其他程式碼中(「2」和「5」與「25」)。

例如「11106」可以解碼為:

  • “AAJF”,分組為 (1, 1, 10, 6)
  • 「KJF」與分組 (11, 10, 6)
  • 分組 (1, 11, 06) 無效,因為「06」不是有效代碼(只有「6」有效)。

注意:可能存在無法解碼的字串。

給定一個僅包含數字的字串 s,傳回對其進行解碼的方式數。如果整個字串無法以任何有效方式解碼,則傳回 0.

產生測試案例,以便答案適合32位元整數。

例如:

Input: s = "12"

Output: 2

Explanation: "12" could be decoded as "AB" (1 2) or "L" (12).

或:

Input: s = "226"

Output: 3

Explanation: "226" could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).

或:

Input: s = "06"

Output: 0

Explanation: "06" cannot be mapped to "F" because of the leading zero ("6" is different from "06"). In this case, the string is not a valid encoding, so return 0.

約束條件是:

  • 1
  • s 僅包含數字,並且可能包含前導零。

我認為這是您乍看之下不那麼困難的問題之一,直到您嘗試解決它為止。

首先,讓我們從最簡單的見解開始:一個字元可以被解碼為它本身(僅一個字元)或兩位數的一部分。
如果它是第一個選項,我們只能有從 1 到 9 的數字,因為 0 本身不映射到任何東西。
但是,兩位數的範圍可以是 10 到 26。

與本章前面的問題一樣,我們可以先建立一個 dp 陣列來保存迭代字串時每個字元的解碼方式數量。
與爬樓梯非常相似,我們必須使用長度 s.length 1 初始化數組,因為我們需要考慮我們尚未解碼任何內容的事實。
換句話說,當沒有字元時,只有一種方式來「解碼」:根本不解碼。

因此,我們可以將所有值初始化為 0,除了第一個索引將是 1。

let dp = Array.from({ length: s.length   1 }, () => 0);

dp[0] = 1;

同樣,與前面的問題類似,我們必須保留底部的兩個值,因此我們必須初始化數組的第二個槽,它對應於解碼字串中第一個字元的方法數。

我們知道,如果它是“0”,我們就無法對其進行解碼,因此在這種情況下解碼它的方法數將為 0。
請注意,無法解碼根本不進行任何解碼不同:在第一種情況下,解碼方式的數量為0,但在第二種情況下(如我們剛剛用dp[0]做的),可以說解碼的方式數是1。

在所有其他情況下,只有一種方法對其進行解碼,因為它只是一個字元。因此,我們將相應地初始化 dp[1]:

dp[1] = (s[0] === '0') ? 0 : 1;

現在我們可以從第三個索引開始迭代。我們將同時查看前一個數字和前兩個數字。

只要前一個數字不是數字 0,我們就可以新增數組前一個槽的任何內容。

並且,只要前兩位數字構成10到26之間的數字,我們也可以加入對應的解。總而言之,它可以看起來像這樣:

for (let i = 2; i 



筆記
我們使用方便的一元加運算子將字串字元轉換為數字。從問題約束我們知道字串 s 只包含數字。

此時,我們在最後一個索引(對應於 s.length)中得到了結果,因此我們可以返回它:

function numDecodings(s: string): number {
  /* ... */

  return dp[s.length]; 
}

總的來說,我們的解決方案是這樣的:

function numDecodings(s: string): number {
  let dp = Array.from({ length: s.length   1 }, () => 0);

  dp[0] = 1;
  dp[1] = (s[0] === '0') ? 0 : 1;

  for (let i = 2; i 



時間和空間複雜度

此解決方案的時間和空間複雜度均為 O(n)O(n) 在) 當我們迭代所有字元進行常數操作時,我們必須保留一個數組,其大小將隨著輸入大小的增加而增加。


接下來是硬幣找零的問題。在那之前,祝您編碼愉快。

版本聲明 本文轉載於:https://dev.to/rivea0/leetcode-meditations-decode-ways-6d5?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何從C#中的非UI線程安全地更新UI元素?
    如何從C#中的非UI線程安全地更新UI元素?
    避免跨線程錯誤:安全地從非 UI 線程更新 UI 元素 在從非 UI 線程(例如串口數據接收事件生成的線程)與 UI 元素交互時,必須處理線程安全問題以避免跨線程錯誤。 在C# 代碼中,錯誤“跨線程操作無效:從創建控件'textBox1' 的線程以外的線程訪問控件'tex...
    程式設計 發佈於2025-02-06
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式界面中實現垂直滾動元素的CSS高度限制 考慮一個佈局,其中我們具有與可滾動的映射div一起移動的subollable map div用戶的垂直滾動,同時保持其與固定側邊欄的對齊方式。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 可以限制地圖的滾動,我們可以利用CS...
    程式設計 發佈於2025-02-06
  • 'exec()
    'exec()
    Exec對本地變量的影響: exec function,python staple,用於動態代碼執行的python staple,提出一個有趣的Query:它可以在函數中更新局部變量嗎? python 3 Dialemma 在Python 3中,以下代碼shippet無法更新本地變量,因為人...
    程式設計 發佈於2025-02-06
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    如何為JavaScript對像變量創建動態鍵,嘗試為JavaScript對象創建動態鍵,使用此Syntax jsObj['key' i] = 'example' 1;將不起作用。正確的方法採用方括號:他們維持一個長度屬性,該屬性反映了數字屬性(索引)和一個數字屬性的數量。標準對像沒有模仿這...
    程式設計 發佈於2025-02-06
  • 可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    </main> <section> ,但无法使其正常工作,如您所见。任何洞察力都将不胜感激! display:grid; { position:sticky; top:1em; z-index:1 1 ; { { { pos...
    程式設計 發佈於2025-02-06
  • 立即吸引用戶:在您的React Spa中嵌入交互式演示
    立即吸引用戶:在您的React Spa中嵌入交互式演示
    如果圖片值得一千個單詞,那麼一個交互式演示必須值得...一百萬? 您喜歡通過流行語滾動以了解應用程序的目的嗎?可能不是。而且我不在乎為我的最新激情項目Wanna寫所有這些泡沫。因此,我追求了一個更有趣的解決方案:將我的應用程序嵌入其自己的著陸頁中供用戶探索! [2 這個GIF具有263幀,所以我想...
    程式設計 發佈於2025-02-06
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月份)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP...
    程式設計 發佈於2025-02-06
  • 重新切片在Go Slices中的基礎陣列如何表現?
    重新切片在Go Slices中的基礎陣列如何表現?
    在GO中重新切割切片:混淆和澄清在GO中,切片是表示代表數據數組的強大而有效的方法。但是,了解他們的複雜性對於初學者來說可能具有挑戰性。這樣一個方面就是重新切割切片的概念。 考慮以下代碼: int,5) printslice(“ a”,a) B:= make([] int,0,5)...
    程式設計 發佈於2025-02-06
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    克服go mod中的模塊路徑差異 coreos/bbolt:github.com/coreos/ [email受保護]:解析go.mod:模塊將其路徑聲明為:go.etcd.io/bbolt `要解決此問題,您可以在go.mod文件中使用替換指令。只需在go.mod的末尾添加以下行:[&& &...
    程式設計 發佈於2025-02-06
  • 如何使用FormData()處理多個文件上傳?
    如何使用FormData()處理多個文件上傳?
    )處理多個文件輸入時,通常需要處理多個文件上傳時,通常是必要的。可以將fd.append("fileToUpload[]", files[x]);方法用於此目的,允許您在單個請求中發送多個文件。 初始嘗試 在JavaScript中,一種常見方法是:); 但是,此代碼僅處理第...
    程式設計 發佈於2025-02-06
  • hasvalue或!= null:哪個更好,最好檢查C#中的可定性值?
    hasvalue或!= null:哪個更好,最好檢查C#中的可定性值?
    C# 中可空值的 HasValue 與 != null C# 的 Nullable 類型允許可空值,可以是有效值或 null。要檢查是否已分配可空值,有兩種常見方法: Nullable.HasValue Nullable 的 HasValue 屬性指示是否已分配值。它返回一個布爾值,如果值為非 n...
    程式設計 發佈於2025-02-06
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決“一般錯誤:2006 MySQL 服務器已消失”介紹:將數據插入MySQL 數據庫有時會導致錯誤“一般錯誤:2006 MySQL 服務器已消失”。當與服務器的連接丟失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變量之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2025-02-06
  • 啟動PHP函數時的andand(&)是什麼意思?
    啟動PHP函數時的andand(&)是什麼意思?
    為什麼通過參考返回? 利用使用返回返回函數的庫,請考慮一個涉及Facebook庫的簡化示例:在此示例中,function users_hasapppermission返回對符合特定用戶檢查應用程序許可結果的變量的引用。通過將結果分配給$結果,任何後續修改為$結果也將修改原始參考。
    程式設計 發佈於2025-02-06
  • 在沒有密碼提示的情況下,如何在Ubuntu上安裝MySQL?
    在沒有密碼提示的情況下,如何在Ubuntu上安裝MySQL?
    在ubuntu 使用debconf-set-selections sudo debconf-set-selections
    程式設計 發佈於2025-02-06
  • 如何在整個HTML文檔中設計特定元素類型的第一個實例?
    如何在整個HTML文檔中設計特定元素類型的第一個實例?
    [2單獨使用CSS,整個HTML文檔可能是一個挑戰。 the:第一型偽級僅限於與其父元素中類型的第一個元素匹配。 以下CSS將使用添加的類樣式的第一個段落: }
    程式設計 發佈於2025-02-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3