Leetcode題解 DecodeWays

2021-03-02 程式設計師大白

點擊上方「程式設計師大白」,選擇「星標」公眾號

重磅乾貨,第一時間送達

題意

題目:路徑解碼  一條包含A - Z字符的信息被使用如下規則進行編碼: 

'A' -> 1
'B' -> 2
...
'Z' -> 26

給定一條編碼好的數字串,確定總的解碼方法數.  舉個例子,給定編碼好的信息"12",可以被解碼為AB"(1 2)或者"L"(12).因此,這個總的解碼數量是2.  

題解

算法及複雜度(0 ms)  本題和爬梯子(第70題)那個題有點像,仔細考慮一下看看是不是這樣.  每個英文字母最多用兩個數字進行編碼,也就是在解碼的時候,每次使用一個數字或者兩個數字進行解碼.換一種說法,對前i個數字解碼可以轉化為:在前i-2個數字已經解碼的基礎上,把(i-1, i)解碼成一個字母,或者在前i-1個數字已經解碼的基礎上,把(i)轉化為一個字母.  根據以上分析,假如把dp[i]來表示以從0到第i個數字的數字串的解碼方法數,那麼dp[i]可以從dp[i - 1]和dp[i - 2]得到.這個轉移過程暗示動態規划過程中的最優子結構性質.  對狀態轉移過程進行分析,分析狀態轉移過程需要滿足的條件(這一部分靠細心吧): 

先求出來原數字串中第i-1和第i個數字代表的真實數值,定義為value,則有

dp[i] = dp[i - 1]   0 < value < 10
dp[i] = dp[i - 2]   value = 10 or 20
dp[i] = dp[i - 1] + dp[i - 2] 10 < value < 20 or 20 < value <= 26

以上過程可以自己簡單畫一個數軸分析一下.  根據以上過程進行編碼提交,發現發揮一個Wrong Answer,而錯誤的數據是"100",經過分析發現,題意可能存在一點問題,本題題意是給定編碼好的信息,來進行解碼,所以至少存在一種解碼方式,可是進行提交會發現,存在有的給定的編碼好的信息的解碼方式為0,也就是給定的數字串無法進行解碼,與題意似乎有點矛盾.這裡注意一下.  但是為了AC掉這個題目,對自己的答案還是進行了補充,也就是,當value % 10 == 0 && value / 10 != 1 && value / 10 != 2時,直接返回0,經過補充之後,可以順利進行AC.  時間複雜度: O(n). n是數字串的長度,根據以上算法可以知道,數字串只需要遍歷一遍即可得到結果.  代碼參見本文件夾下solution.cpp  

算法正確性

舉個例子  

//輸入數據,s = "101"

//初始化dp[0] = dp[1] = 1

// i = 2, value = (s[i - 2] - '0') * 10 + s[i - 1] - '0' = 10
dp[i] = dp[i - 2] = 1

// i = 3, value = (s[i - 2] - '0') * 10 + s[i - 1] - '0' = 1
dp[i] = dp[i - 1] = 1

CPP代碼

class Solution {
public:
    int numDecodings(string s) {
        
        int len = s.length();
        if(len == 0 || s[0] == '0') return 0;
        
        vector<int>dp(len + 1);
        dp[0] = 1;dp[1] = 1;
        
        for(int i = 2; i <= len; i ++ ){
            int value = (s[i - 2] - '0') * 10 + s[i - 1] - '0';
            if(value % 10 == 0) {
                int temp = value / 10;
                if(temp == 1 || temp == 2) {
                    dp[i] = dp[i - 2];
                } else {
                    return 0;
                }
            } else {
                if(value < 10 || value > 26) {
                    dp[i] = dp[i - 1];
                } else {
                    dp[i] = dp[i - 1] + dp[i - 2];
                }
            }
        }
        return dp[len];
    }
};

重磅!程式設計師大白交流群-學術微信交流群已成立

額外贈送福利資源!邱錫鵬深度學習與神經網絡,pytorch官方中文教程,利用Python進行數據分析,機器學習學習筆記,pandas官方文檔中文版,effective java(中文版)等20項福利資源

獲取方式:進入群後點開群公告即可領取下載連結

拉人小助手出了問題,最近不能使用,請大家加入微信2群

注意:請大家添加時修改備註為 [學校/公司 + 姓名 + 方向]

例如 —— 哈工大+張三+對話系統。

號主,微商請自覺繞道。謝謝!

推薦閱讀

Leetcode題解 SimplifyPath

Leetcode題解 InsertInterval

Leetcode題解 MergeIntervals

Leetcode題解 JumpGame

Leetcode題解 N-Queens

Leetcode題解 Trapping Rain Water

關於程式設計師大白

程式設計師大白是一群哈工大,東北大學,西湖大學和上海交通大學的碩士博士運營維護的號,大家樂於分享高質量文章,喜歡總結知識,歡迎關注[程式設計師大白],大家一起學習進步!

相關焦點

  • Leetcode題解 WordBreak
    題解算法及複雜度(6 ms)  本問題是確定一個字符串是否能分割成多個單詞,這些單詞都在字典中出現.  由於本題每個組成成分都是單詞,也就是每次在原有字符串的返回true的基礎上增加一個字典中的單詞來組成新的能夠返回true的字符串.發現這是一種全局同一限制性的求解問題,限制條件是每次字符串增加的都是一個存在於字典中的單詞.舉個例子說明一下:  比如字符串是"leetcodeisnice
  • 回溯法|一文解決四道 Leetcode「組合總和」題
    解集不能包含重複的組合。解集不能包含重複的組合。 組合總和」 和 「leetcode-40.1.2 題目分析當我們遇到:「可行解是什麼、可行解有多少個」這類問題時,最樸素的想法就是「枚舉」,枚舉出所有可能的結果,並在枚舉的過程中不斷刪除不符合條件的解。
  • leetcode刷題指南之PalindromePairs
    則(0, 1)為一解;對於"bat", 我們發現map["tab"] = 0,且末尾串""為回文串。則(1, 0)為一解。故答案為[[0, 1], [1, 0]]。= i)25                    ans.push_back({ma[r], i});26            }27        }28        return ans;29    }30};作者:東大ACM退役隊伍編輯:劉凱旋推薦閱讀:leetcode刷題指南之
  • Leetcode題解 ScrambleString
    推薦閱讀Leetcode題解 MaximalRectangleLeetcode題解 Word_SearchLeetcode題解 MergeIntervalsLeetcode題解 JumpGameLeetcode題解 N-Queens
  • Leetcode題解 HouseRobber
    題意題解算法及複雜度(Run Time 0ms)這個一個求最優解的問題因為動態規劃常用來求最優解。先假定這個問題可以用動態規划進行求解,找最優子結構,假定求前n+1(n >= 2 )個房屋盜賊能偷到的最多的錢為dp[n]。由於每個房屋的錢都是非負的,所以前n+1個房屋的總的可以偷的錢,要麼與前n個房屋偷的錢相等,要麼等於前n-1個房屋可以偷的錢,加上第n+1個房屋的錢數,除了這兩種情況外,沒有其他情況。
  • Leetcode題解 Gray Code
    格雷碼:在一組數的編碼中,若任意兩個相鄰的代碼只有一位二進位數不同,則稱這種編碼為格雷碼(Gray Code)解題思路:   簡單的模擬生成題,由于格雷碼要求相鄰的數字有且僅有一位不同,先考慮如果當前已經有不大於N-1位的合法格雷碼序列
  • LeetCode-53. Maximum Subarray | 最大子序和
    題解難度為簡單。temp = temp + nums[i] } else { temp = nums[i] } if temp > max { max = temp } } return max //返回最大值}執行結果:leetcode-cn
  • Leetcode題解 Rotate Array
    推薦閱讀Leetcode題解 SimplifyPathLeetcode題解 InsertIntervalLeetcode題解 MergeIntervalsLeetcode題解 JumpGameLeetcode題解 N-Queens
  • 用這種解題方法,我解決了大部分的 leetcode 貪心算法題
    第一題,leetcode中等難度題目先來一道簡單的字典序排列的問題,這個題目我這裡不會用最優解來解決這個問題,這個是leetcode的中等難度的題目,最優解還是需要再思考一下的,這道題目作為文章開頭只是為了介紹我想要介紹的貪心的解題的一種思路而已,大佬請勿噴!!
  • Leetcode題解 Course Schedule
    只要該拓撲圖能夠存在一合法的拓撲解,則所有課程能夠順利修習完成。入度為0節點,若當前無法找到且圖中還有未被刪除的節點,則說明當前圖能存在環,無解;拓展從該節點出發的有向邊能到達的另一節點,將其入度剪一;從圖中刪除該節點,若刪除的節點數目已達到N則表示所有節點均已輸出,存在一個合法解;
  • Leetcode題解 Word_Search
    visited[i][j]=0;                           //一定要保證的是使他變回來        //return false;                  }    bool exist(vector<vector<char>>& board, string word) {        // 此題用搜索
  • Leetcode題解 Edit Distance
    推薦閱讀Leetcode題解 SimplifyPathLeetcode題解 InsertIntervalLeetcode題解 MergeIntervalsLeetcode題解 JumpGameLeetcode題解 N-QueensLeetcode題解 Trapping Rain Water關於程式設計師大白
  • 字節大佬Leetcode刷題筆記,看完吊打問你算法的面試官
    介紹leetcode 題解,記錄自己的 leetcode 解題之路。目前分為五個部分:第一個部分是 leetcode 經典題目的解析,包括思路,關鍵點和具體的代碼實現。第二部分是對於數據結構與算法的總結第三部分是 anki 卡片, 將 leetcode 題目按照一定的方式記錄在 anki 中,方便大家記憶。
  • Leetcode題解 Course Schedule II
    對於如何判斷是否有解的過程可以參見207的題解,就不在此贅述。一門課在當前是否能夠選修,決定於其全部的前驅節點都已經被輸出,即該節點當前的入度為0.  將其加入輸出隊列之中,若當前無法找到且圖中還有未被刪除的節點,則說明當前圖能存在環,無解;拓展從該節點出發的有向邊能到達的另一節點,將其入度剪一;從圖中刪除該節點,若刪除的節點數目已達到N則表示所有節點均已輸出,存在一個合法解,
  • Leetcode題解 WordBreakII
    解題思路這題和Leetcode 132很像,同樣是切分,同樣是切分出來的要滿足一定條件,不同的是這題要輸出所有的可能性。推薦閱讀Leetcode題解 SimplifyPathLeetcode題解 InsertIntervalLeetcode題解 MergeIntervalsLeetcode題解 JumpGameLeetcode題解 N-Queens
  • 刷LeetCode 對於國內 IT 企業面試幫助大嗎?
    今年大三,大四要找工作了,沒搞過ACM(其實挺後悔的),校招面試都考算法的,我這種沒搞過ACM的感覺挺沒競爭力的,同學有推薦leetcode的,不知對於國內的IT企業面試幫助大嗎?對於 BAT 等一線大廠來說,算法面試是必須跨過去的一道坎,所以必須得準備好算法面試~但很多時候,你即使提前複習了這些最常見的面試算法題,你依舊無法通過算法面試!為什麼?你在提前準備複習的時候,在網上找了半天響應題目的分析文章,但你看了就是不懂。你在面試的時候,卡殼了,一時間忘了怎麼寫代碼了我來助你一臂之力!!
  • leetcode刷題最強指南(版本1.0)
    為什麼會有這篇刷題指南很多剛開始刷題的同學都有一個困惑:面對leetcode上近兩千道題目,從何刷起
  • Leetcode題解 MaximumProductSubarray
    題解算法及複雜度(9 ms)  考慮本題是最大子段的乘積,可以聯想到動態規劃中的一個經典問題——最大子段和.最大欄位和的求解過程中,設定以位置i結尾的連續子段的最大子段和為dp[i],那麼狀態轉移方程為
  • Leetcode題解 Set_Matrix_Zeroes
    推薦閱讀Leetcode題解 Edit DistanceLeetcode題解 InsertIntervalLeetcode題解 MergeIntervalsLeetcode題解 JumpGameLeetcode題解 N-Queens
  • Leetcode題解 MaximalRectangle
    推薦閱讀Leetcode題解 SimplifyPathLeetcode題解 InsertIntervalLeetcode題解 MergeIntervalsLeetcode題解 JumpGameLeetcode題解 N-Queens