Leetcode 91. Decode Ways

A message containing letters from A-Z is being encoded to numbers using the following mapping:
'A' -> 1
'B' -> 2
...
'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.

For example,
Given encoded message "12", it could be decoded as "AB" (1 2) or "L" (12).
The number of ways decoding "12" is 2.

題意:如果從A到Z可以按1-26進(jìn)行編碼,那么給出一串?dāng)?shù)字,有多少種解碼方式?

思路:
例如給出1221,如果從頭開始用深度搜索的方式找,對于每一位,都有可能有兩種解碼方法,時間復(fù)雜度將會非常高。
換一種角度,對于以每一位結(jié)尾的字符串來說,它的解碼方法和前面數(shù)字串解碼的方式相關(guān),有點像jump那道題,可以用動態(tài)規(guī)劃的方法解決。
以dp[n]表示從頭到第n-1位有多少種解碼方法,如果當(dāng)前位置n的數(shù)字是1-9,那么dp[n] += dp[n-1],如果n-1位不等于0并且和n位組合起來的數(shù)字小于等于26,dp[n] += dp[n-2]。dp[0]需要初始化為1,因為計算dp[2]時,如果前兩位組合是一個合法的編碼,將需要dp[0]。

public int numDecodings(String s) {
    if (s == null || s.length() == 0) {
        return 0;
    }

    int len = s.length();
    int[] dp = new int[len + 1];
    dp[0] = 1;
    dp[1] = s.charAt(0) != '0' ? 1 : 0;
    for (int i = 2; i <= len; i++) {
        if (s.charAt(i-1) != '0') {
            dp[i] += dp[i-1];
        }
        if (s.charAt(i-2) != '0' && Integer.valueOf(s.substring(i-2, i)) <= 26) {
            dp[i] += dp[i-2];
        }
    }

    return dp[len];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 題目 A message containing letters from A-Z is being encoded...
    persistent100閱讀 524評論 0 0
  • LeetCode 91 Decode Ways A message containing letters from...
    ShuiLocked閱讀 1,205評論 1 0
  • 原題 有一個消息包含A-Z通過以下規(guī)則編碼 現(xiàn)在給你一個加密過后的消息,問有幾種解碼的方式 樣例給你的消息為12,...
    Jason_Yuan閱讀 816評論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,923評論 0 33
  • 也許是天氣太過于燥熱,心情格外煩悶,友人約我出去走走,我毫不猶豫的答應(yīng)了。我才知道,距離我工作的縣城,不過十幾公里...
    不喜灰閱讀 539評論 0 3

友情鏈接更多精彩內(nèi)容