LeetCode 91 解碼方法

2021-09-13 21:06:57 字數 1323 閱讀 9812

一條包含字母 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) 。

就以例子中的226來看。首先判斷2是否為0以及是否為小於26,如果滿足條件那麼方法數+1,接著看22,也滿足加1,接著看第二個2,發現滿足加1。從這個可以看出來只要開始遍歷,分別看單數字和與後面乙個數字的組合,判斷是否滿足條件即可,滿足就加1不滿足就下乙個。那麼這樣就可以用遞迴做了。

class solution 

//先將字串轉換成整數型別的陣列

dfs(a,0,a[0]);

return count;

}public void dfs(int a,int idx,int num)

dfs(a,idx + 1,a[idx + 1]);

// 單個數字為一組

dfs(a,idx + 1,num * 10 + a[idx + 1]);

// 和後乙個數字為一組

}}

事實證明,當我提交的時候時間600ms的我驚呆了,竟然這麼慢,不過確實兩次遞迴不慢才怪了相當於遍歷了兩遍陣列,時間的複雜度就上公升到了o(m^2)。那就應該換一種方法來降低複雜度,從上面的推理可能還看不出什麼,那麼下面就用更長一點的字串來展示一下。以2331231216為例吧,這個肯定夠長了。

從0開始,0為索引值。

2成立+1,23成立+1;

3成立+1,33不成立保持+1;

3成立+1,31不成立保持+1;

1成立+1,12成立+1……

可以看出來count是怎麼加的呢?

如果dp[n-1]滿足條件就為1,10*dp[n-2]+dp[n-1]滿足條件就再加1

可以從我的表示式看出來,這就是用動態規劃了。

為什麼用n-1 呢,因為前兩個為初始狀態,所以要從第2個開始,這樣就能保持空間複雜度為o(1)了

class solution 

else}}

return dp[n];

}}

第乙個時間複雜度為o(m^2)

第二個就是o(n)

空間複雜度都為o(1)

[1]

LeetCode91 解碼方法

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

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

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 或者 bbf...