LeetCode第91題(解碼方法)

2021-08-28 07:28:51 字數 1405 閱讀 7684

一條包含字母 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), 或者 「bbf」 (2 2 6) 。

這題 你需要注意以下幾點:

1).s的首部不能是0!!

2).中間部分可以是0但是 它的前面那個數字必須是1 或者2(以上兩點需要在開始計算前 先遍歷一遍)

3).計算過程中如果遇到0怎麼辦???(我們需要把這個0與他前面那個數字x(如果步驟1和步驟2做過了 只可能是1或者2)繫結在一起 )

4).繫結的那個 x不能再與(x之前那個數字組合在一起 假設前面那個數字存在的話) ps:::比如 1220 (「20」是要在一起的 同時22雖然我們可以解碼出來乙個字元 但是 20已經被綁住一起了!!!)

5).對於 乙個串 s 他的解碼個數是不是直接由 (前面s.size()-1 個推倒出來 的 比如s=123 假設我已經知道 「23」的解碼個數為k 能否直接推倒 出 「123」的個數)????? ps::我們知道 這些數字只要組合起來<=26 是可以看成乙個數的 所以 從後往前遍歷到「1」的時候 其實 由兩部分組成

第一 把「1」單獨看 s 就是「23」的解碼個數

第二把「12」單獨看 s就是「3」的解碼個數(注意 如果 s=1203 這個時候 只有第一種情況 你是不能把 12 合在一起看的 2必須要和0繫結在一起 也就是 4)中我們提到的情況)

於是 s(n)就等於以上兩種情況的個數和(以此類推)

int numdecodings(string s) 

}} vectortotal(s.size()+1);

for (int i = 0; i <= total.size() - 1; i++)total[i] = 0;

total[total.size() - 1] = 1;

for (int end = s.size() - 1;end >= 0; end--)

else

}string tmp = s.substr(end , 2);

int t = atoi(tmp.c_str());

if (t <= 26) total[end] = total[end + 2] + total[end + 1];

else total[end] = total[end + 1];}}

}} return total[0];

}

leetcode刷題 91解碼方法

一條包含字母 a z 的訊息通過以下方式進行了編碼 a 1 b 2 z 26 給定乙個只包含數字的非空字串,請計算解碼方法的總數。示例 1 輸入 12 輸出 2 解釋 它可以解碼為 ab 1 2 或者 l 12 這道題和70題爬樓梯非常類似,需要使用動態規劃的方法 class solution de...

leetcode 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 或...

LeetCode91 解碼方法

這題,我花了好大的功夫才通過,中途踩了很多坑,從這個15頂25踩,通過率只有10 多,就能看出這個題,雖然是乙個中等難度的題,但是並沒有那麼好做。看到題目,感覺有點像爬樓梯的那個?想到用動態規劃。第一次寫 沒有考慮0的情況,出錯,那麼就考慮吧,如果出現在頭,就返回0,出現的中間的話。不過我是從後往前...