/** * 䏿¡å å«åæ¯ A-Z çæ¶æ¯éè¿ä»¥ä¸æ¹å¼è¿è¡äºç¼ç ï¼ * * 'A' -> 1 * 'B' -> 2 * ... * 'Z' -> 26 * * ç»å®ä¸ä¸ªåªå 嫿°åçé空å符串ï¼è¯·è®¡ç®è§£ç æ¹æ³çæ»æ°ã * * ç¤ºä¾ 1: * * è¾å ¥: "12" * è¾åº: 2 * è§£é: å®å¯ä»¥è§£ç 为 "AB"ï¼1 2ï¼æè "L"ï¼12ï¼ã * * ç¤ºä¾ 2: * * è¾å ¥: "226" * è¾åº: 3 * è§£é: å®å¯ä»¥è§£ç 为 "BZ" (2 26), "VF" (22 6), æè "BBF" (2 2 6) ã * * æ¥æºï¼åæ£ï¼LeetCodeï¼ * 龿¥ï¼https://leetcode-cn.com/problems/decode-ways * è使å½é¢æ£ç½ç»ææãåä¸è½¬è½½è¯·èç³»å®æ¹ææï¼éåä¸è½¬è½½è¯·æ³¨æåºå¤ã */ class Solution91 { public static void main(String[] args) { final Solution91 s = new Solution91(); System.out.println(s.numDecodings("1")); System.out.println(s.numDecodings("10")); System.out.println(s.numDecodings("101")); System.out.println(s.numDecodings("1010")); System.out.println(s.numDecodings("10101")); System.out.println(s.numDecodings("101010")); } public int numDecodings(String s) { // 设 G(n) æ¯è¯¥ä¸²å n ä½è½å¤ç»æçç¼ç æ»æ° // å½å符é¿åº¦å¢å æ¶ï¼æ°å符å¯ä»¥éæ©åç¬ç»æç¼ç ï¼è¯å®å¯ä»¥ï¼ï¼ // ä¹å¯ä»¥å°è¯ä¸åé¢çæ°åç»æç¼ç ï¼ // // å½å¯ä»¥ä¸å颿°åç»æç¼ç æ¶ï¼å ¶å ¬å¼ä¸º G(n - 2)ï¼å³âä¸ç®åé¢é£ä¸ªå符è½å¤ç»æçç¼ç æ»æ°â // G("1234") -> G("12")(if can) + G("123") int l = s.length(); if (l == 0) { return 0; } if ('0' == s.charAt(0)) { return 0; } int[] dp = new int[l + 1]; dp[0] = 0; dp[1] = 1; for (int i = 2; i <= l; i++) { // i means 'current length' char current = s.charAt(i - 1); char previous = s.charAt(i - 2); if (current != '0') { dp[i] = dp[i - 1]; } if (previous != '0') { int num = Integer.parseInt(previous + "" + current); if (num > 0 && num <= 26) { dp[i] += Math.max(1, dp[i - 2]); } } if (dp[i] == 0) { return 0; } } return dp[l]; } }