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進行編碼,那么給出一串數字,有多少種解碼方式?

思路:
例如給出1221,如果從頭開始用深度搜索的方式找,對于每一位,都有可能有兩種解碼方法,時間復雜度將會非常高。
換一種角度,對于以每一位結尾的字符串來說,它的解碼方法和前面數字串解碼的方式相關,有點像jump那道題,可以用動態規劃的方法解決。
以dp[n]表示從頭到第n-1位有多少種解碼方法,如果當前位置n的數字是1-9,那么dp[n] += dp[n-1],如果n-1位不等于0并且和n位組合起來的數字小于等于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];
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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