1. 程式人生 > >decode-ways(動態規劃)

decode-ways(動態規劃)

mine nta sage 方法 表示 subst nco ssa 嘗試

題目描述


  A message containing letters fromA-Zis 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.

解題思路:

  解碼是有規律的,所以我們可以嘗試動態規劃。假設數組dp[i]表示從頭到字符串的第i位,一共有多少種解碼方法的話,那麽如果字符串的第i-1位和第i位能組成一個10到26的數字,說明我們是在第i-2位的解碼方法上繼續解碼。如果字符串的第i-1位和第i位不能組成有效二位數字,而且第i位不是0的話,說明我們是在第i-1位的解碼方法上繼續解碼。所以,如果兩個條件都符合,則dp[i]=dp[i-1]+dp[i-2],否則dp[i]=dp[i-1]

復雜度

  時間 O(N) 空間 O(N)

註意

  如果出現無法被兩位數接納的0,則無法解碼,我們可以在一開始就判斷,並將其初始化為0,這樣後面的相加永遠都是加0

代碼實現

public class Solution {
    public int numDecodings(String s) {
        if(s.length() == 0) return s.length();
        int[] dp = new int[s.length() + 1];
        // 初始化第一種解碼方式
        dp[0] = 1;
        // 如果第一位是0,則無法解碼
        dp[1] = s.charAt(0) == ‘0‘ ? 0 : 1;
        for(int i = 2; i <= s.length(); i++){
            
// 如果字符串的第i-1位和第i位能組成一個10到26的數字,說明我們可以在第i-2位的解碼方法上繼續解碼 if(Integer.parseInt(s.substring(i-2, i)) <= 26 && Integer.parseInt(s.substring(i-2, i)) >= 10){ dp[i] += dp[i - 2]; } // 如果字符串的第i-1位和第i位不能組成有效二位數字,在第i-1位的解碼方法上繼續解碼 if(Integer.parseInt(s.substring(i-1, i)) != 0){ dp[i] += dp[i - 1]; } } return dp[s.length()]; } }

decode-ways(動態規劃)