力扣--91. 解码方法
生活随笔
收集整理的這篇文章主要介紹了
力扣--91. 解码方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
力扣–91. 解碼方法
文章目錄
- 力扣--91. 解碼方法
- 一、題目描述
- 二、解題思路
- 三、代碼
一、題目描述
一條包含字母 A-Z 的消息通過以下方式進行了編碼:
'A' -> 1 'B' -> 2 ... 'Z' -> 26給定一個只包含數字的非空字符串,請計算解碼方法的總數。
- 示例 1:
- 示例 2:
二、解題思路
- 首先要根據當前的字符是否為 0 進行判斷
- s 為字符串 s, f(i) 代表 到 s[i] 一共有多少種解碼方式
- if s[i] == '0'
- if s[i-1] == '1' || s[i-1] =='2' --> f(i) == f(i-2)
也就是說最后兩位只能合并解碼為 10 或者 20, 例如 1212120 那么此時解的數量與 12121 相同(只是解中增加了一個20的對應字母, 解總數量未增加)
- else --> return 0
字符串非法, 也就是 0 只能出現在 1 或者 2 的后面, 其它情況都是無解的如: 1212130, 30 無法對應任何字符,直接return 0
- if s[i] != '0'
- if s[i-1] == '1' || (s[i-1] == '2' && s[i] >= '1' && s[i] <= '6') -->f(i) == f(i - 1) + f(i - 2)
也就是最后兩位在 10~26 之間如 1212121, 可以翻譯成 12121 + 21, 或者 121212 + 1
- else --> f(i) == f(i - 1)
也就是最后兩位不在 10~26 之間如 1212132 那只能翻譯成 121213 + 2 代碼
三、代碼
class Solution { public:int numDecodings(string s) {if(s[0] == '0')return 0;// 存儲的是 cache[i + 1] 是 s[i] 的解碼數量, 之所以是 //cache[i + 1] , 是為了防止開始循環時 f(i-2) 出現訪問越界vector<int> cache(s.size() + 1, 1); for(int i = 1; i < s.size(); i++){if(s[i] == '0'){if(s[i-1] == '1' || s[i-1] == '2')cache[i + 1] = cache[i - 1];elsereturn 0; // 非法字符串, 無解}else{// 也就是到 i 位置的最后兩位數字為為 [10, 26] //可以和并轉換為一個字母if (s[i-1] == '1' || (s[i-1] == '2' && s[i] >= '1' && s[i] <= '6')) cache[i + 1] = cache[i - 1] + cache[i];elsecache[i + 1] = cache[i];}}return cache[s.size()];} };總結
以上是生活随笔為你收集整理的力扣--91. 解码方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查找两个字符串a,b中的最长公共子串
- 下一篇: 双指针解决力扣两/三数之和问题