91 解碼方法

2021-09-25 03:55:08 字數 1473 閱讀 4940

方法一:動態規劃法

該問題可以通過動態規劃的方法進行求解,我們假設s[i]代表一條長度為i的訊息,對應的解碼方法的總數為dp[i],那麼這個值的大小和dp[i-1]以及dp[i-2]相關,因為解碼時只有一位或者兩位字元可以作為乙個原碼看待。當我們假設這條訊息的最後一位作為原碼時,它的取值範圍為

『1』 ~ 』 9』,需要滿足條件:s[i-1] != 『0』;當我們假設這條訊息的最後兩位作為乙個原碼時,它的取值範圍為 『10』~『26』,需要滿足條件 s[i-2] == 『1』 || (s[i-2] == 『2』 && s[i-1] <= 『6』)。

int numdecodings

(string s)

return dp[n]

;}

複雜度:

時間複雜度: o(n) 。

空間複雜度: o(n) 。

方法二:動態規劃法

當我們假設這條訊息的最後兩位作為乙個原碼時,它的取值範圍為 『10』~『26』,其滿足條件還可以寫為:(s.substr(i-2,2) <= 「26」 && s.substr(i-2,2) >= 「10」)。

int numdecodings

(string s)

return dp[n]

;}

複雜度:

時間複雜度: o(n) ;

空間複雜度: o(n) 。

方法三:動態規劃法(空間複雜度為o(1))

這種方法的主要思想是借用兩個變數a,b來儲存dp[i-1]以及dp[i-2].

其中,a表示當我們假設這條訊息的最後一位作為原碼時,其餘i-1位字元可以得到的解碼方法總數,這時需要判斷第i為是否為』0』;

b表示示當我們假設這條訊息的最後兩位作為原碼時,其餘i-2位字元可以得到的解碼方法總數,這時需要判斷最後兩位的取值是否 在 『10』~'26』之間,

(1)若在,則更新a = a+b(對於當前訊息而言,為解碼總數,對於下乙個長為i+1的訊息而言,它又是最後一位作為原碼時的解碼總數)

b = a - b(b值為未更新之前的a值,對於下乙個長為i+1的訊息而言,它表示最後兩位作為原碼時的解碼總數)

(2)若不在,那麼不能將最後兩位作為原碼看待,b值為0,a = a + b, a值不發生變化(對於當前訊息而言,為解碼總數,對於下乙個長為i+1的訊息而言,它又是最後一位作為原碼時的解碼總數),b值更新為a值(對於下乙個長為i+1的訊息而言,它表示最後兩位作為原碼時的解碼總數)。

int numdecodings

(string s)

else

b = a;

}return a;

}

複雜度:

時間複雜度: o(n) ;

空間複雜度: o(1) 。

91 解碼方法

一條包含字母a z的訊息通過以下方式進行了編碼 a 1 b 2 z 26給定乙個只包含數字的非空字串,請計算解碼方法的總數。示例 1 輸入 12 輸出 2 解釋 它可以解碼為 ab 1 2 或者 l 12 示例 2 輸入 226 輸出 3 解釋 它可以解碼為 bz 2 26 vf 22 6 或者 b...

91 解碼方法

一條包含字母a z的訊息通過以下方式進行了編碼 a 1 b 2 z 26 給定乙個只包含數字的非空字串,請計算解碼方法的總數。示例 1 輸入 12 輸出 2解釋 它可以解碼為 ab 1 2 或者 l 12 示例 2 輸入 226 輸出 3解釋 它可以解碼為 bz 2 26 vf 22 6 或者 bb...

91 解碼方法

對於乙個字串我們有兩種選擇,選乙個 選兩個 注意 0 00 0x 這些坑 暴力遞迴 0開頭的無法翻譯 00,01 if s.charat start 0 選乙個 int res dfs s,start 1 選兩個 保證能選,start不能到最後乙個字元那裡去了 if start n 1 intege...