解碼方法

貴重物品嚴禁踩踏發表於2020-12-08

91. 解碼方法

一條包含字母 A-Z 的訊息通過以下方式進行了編碼:

'A' -> 1
'B' -> 2
...
'Z' -> 26

給定一個只包含數字的非空字串,請計算解碼方法的總數。

題目資料保證答案肯定是一個 32 位的整數。

 

示例 1:

輸入:s = "12"
輸出:2
解釋:它可以解碼為 "AB"(1 2)或者 "L"(12)。

示例 2:

輸入:s = "226"
輸出:3
解釋:它可以解碼為 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

示例 3:

輸入:s = "0"
輸出:0

示例 4:

輸入:s = "1"
輸出:1

示例 5:

輸入:s = "2"
輸出:1

 

提示:

  • 1 <= s.length <= 100
  • s 只包含數字,並且可能包含前導零。
題解
package dp;

/**
 * @author lkp
 * @version 1.0
 * @date 2020/12/7 17:03
 */
public class NumDecodings {

    public static int numDecodings2(String s) {
        if (s.charAt(0) == '0') {
            return 0;
        }
        int pre = 1, curr = 1;//dp[-1] = dp[0] = 1
        for (int i = 1; i < s.length(); i++) {
            int tmp = curr;
            if (s.charAt(i) == '0') {
                if (s.charAt(i - 1) == '1' || s.charAt(i - 1) == '2') {
                    curr = pre;
                } else {
                    return 0;
                }
            } else if (s.charAt(i - 1) == '1' || (s.charAt(i - 1) == '2' && s.charAt(i) >= '1' && s.charAt(i) <= '6')) {
                curr = curr + pre;
            }
            pre = tmp;
        }
        return curr;
    }

    /**
     * @param s
     * @return
     */
    public static int numDecodings(String s) {
        if (s.charAt(0) == '0' ||
                s.contains("00") ||
                s.contains("30") ||
                s.contains("40") ||
                s.contains("50") ||
                s.contains("60") ||
                s.contains("70") ||
                s.contains("80") ||
                s.contains("90")
        ) {
            return 0;
        }
        int[] dp = new int[s.length() + 1];
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i <= s.length(); i++) {
            if (s.charAt(i - 1) == '0') {
                dp[i] = dp[i - 2];
            } else if ((s.charAt(i - 2) == '1') || (s.charAt(i - 2) == '2' && s.charAt(i - 1) <= '6')) {
                dp[i] = dp[i - 1] + dp[i - 2];
            } else {
                dp[i] = dp[i - 1];
            }
        }
        return dp[s.length()];
    }

    public static void main(String[] args) {
        int i = numDecodings("2101");
        System.out.println(i);
    }
}

相關文章