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

LeetCode 冥想:解碼方法

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

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]刪除
最新教學 更多>
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    程式設計 發佈於2024-12-26
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2024-12-26
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-26
  • 為什麼我的 React Native Android 建置在升級到版本 0.71.0-rc.0 後失敗?
    為什麼我的 React Native Android 建置在升級到版本 0.71.0-rc.0 後失敗?
    由於React Native 版本0.71.0-rc.0,React Native Android 建置失敗問題:最近,儘管沒有進行任何程式碼更改,但用戶在建立React Native Android 應用程式時遇到了各種錯誤。這些錯誤的表現可能有所不同,但它們通常涉及安裝失敗或未解決的依賴關係問題...
    程式設計 發佈於2024-12-26
  • 預載如何顯著減少 Web 渲染中的字體載入延遲?
    預載如何顯著減少 Web 渲染中的字體載入延遲?
    有效緩解網頁渲染中的字體載入延遲透過@font-face嵌入自訂字體是網頁設計中的常見做法,但它可能會引入閃爍效果,其中文字最初以預設系統字體呈現,然後在完成後切換到自訂字體。這種不希望的延遲是由字體檔案的非同步載入引起的。 透過「Preload」搶佔字型載入為了最大限度地減少這種延遲,業界標準解決...
    程式設計 發佈於2024-12-26
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-26
  • 如何在單一頁面上使用多個 jQuery 版本而不發生衝突?
    如何在單一頁面上使用多個 jQuery 版本而不發生衝突?
    單頁上的多個jQuery 版本將依賴jQuery 的小部件整合到客戶的網頁中時,如果它們是已經使用過時的jQuery 版本。確保相容性,同時避免干擾現有程式碼變得至關重要。 幸運的是,jQuery 透過其 noConflict 模式提供了解決方案。這允許您載入多個版本的庫而不會發生衝突。 程式碼實作...
    程式設計 發佈於2024-12-26
  • Pandas 中的 For 迴圈總是低效嗎?  什麼時候應該優先考慮迭代而不是向量化?
    Pandas 中的 For 迴圈總是低效嗎? 什麼時候應該優先考慮迭代而不是向量化?
    pandas 中的 for 迴圈真的很糟糕嗎?我什麼時候該關心? 簡介雖然 pandas 以其可加速計算的向量化運算而聞名,但許多程式碼範例仍包含循環。雖然文件建議避免對資料進行迭代,但本文探討了 for 迴圈比向量化方法提供更好效能的場景。 小數據上的迭代與向量化For對於小數據,for 循環的性...
    程式設計 發佈於2024-12-26
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-12-26
  • CSS 中的偶數與奇數列表項樣式:`li:odd`/`:even` 或 `:nth-child()`?
    CSS 中的偶數與奇數列表項樣式:`li:odd`/`:even` 或 `:nth-child()`?
    偶數與奇數列表元素的樣式:偽類與第n 個子元素當嘗試使用CSS 偽類實現列表項的交替顏色時,您可以遇到問題。雖然為此目的使用 li:odd 和 li:even 似乎合乎邏輯,但其行為可能是不可預測的。 要有效地設定列表項目的偶數和奇數實例的樣式,請考慮使用以下方法: 而不是:li { color: ...
    程式設計 發佈於2024-12-26
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-12-26
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-26
  • 如何在 HTML 表格中有效地使用 Calc() 和基於百分比的欄位?
    如何在 HTML 表格中有效地使用 Calc() 和基於百分比的欄位?
    在表格中使用Calc():克服百分比困境創建具有固定寬度列和可變寬度列的表格可能具有挑戰性,尤其是在嘗試在其中使用calc() 函數。 在 HTML 中,使用 px 或 em 設定固定列寬非常簡單。但是,對於可變寬度列,通常使用百分比 (%) 單位。然而,當在表中使用 calc() 時,百分比似乎無...
    程式設計 發佈於2024-12-26
  • 如何在PHP中透過POST提交和處理多維數組?
    如何在PHP中透過POST提交和處理多維數組?
    在PHP 中透過POST 提交多維數組當使用具有可變長度的多列和行的PHP 表單時,有必要進行轉換輸入到多維數組中。這是解決這項挑戰的方法。 首先,為每列分配唯一的名稱,例如:<input name="topdiameter[' current ']" type="...
    程式設計 發佈於2024-12-26
  • for(;;) 迴圈到底是什麼、它是如何運作的?
    for(;;) 迴圈到底是什麼、它是如何運作的?
    揭秘神秘的for(;;) 循環在古老的程式碼庫深處,你偶然發現了一個令人困惑的奇特for 循環你的理解。其顯示如下:for (;;) { //Some stuff }您深入研究線上資源,但發現自己陷入沉默。讓我們來剖析這個神秘的構造。 for 迴圈的結構Java 中的for 迴圈遵循特定的語...
    程式設計 發佈於2024-12-25

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

Copyright© 2022 湘ICP备2022001581号-3