|
| 1 | +# 91. 解码方法 |
| 2 | + |
| 3 | +[url](https://leetcode-cn.com/problems/decode-ways/) |
| 4 | + |
| 5 | +## 题目 |
| 6 | + |
| 7 | +一条包含字母 `A-Z` 的消息通过以下映射进行了 **编码** : |
| 8 | + |
| 9 | + |
| 10 | +``` |
| 11 | +'A' -> 1 |
| 12 | +'B' -> 2 |
| 13 | +... |
| 14 | +'Z' -> 26 |
| 15 | +``` |
| 16 | + |
| 17 | +要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"111" 可以将 "1" 中的每个 "1" 映射为 "A" ,从而得到 "AAA" ,或者可以将 "11" 和 "1"(分别为 "K" 和 "A" )映射为 "KA" 。注意,"06" 不能映射为 "F" ,因为 "6" 和 "06" 不同。 |
| 18 | + |
| 19 | +给你一个只含数字的 非空 字符串 num ,请计算并返回 解码 方法的 总数 。 |
| 20 | + |
| 21 | +题目数据保证答案肯定是一个 32 位 的整数。 |
| 22 | + |
| 23 | +``` |
| 24 | +输入:s = "12" |
| 25 | +输出:2 |
| 26 | +解释:它可以解码为 "AB"(1 2)或者 "L"(12)。 |
| 27 | +输入:s = "226" |
| 28 | +输出:3 |
| 29 | +解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。 |
| 30 | +``` |
| 31 | + |
| 32 | +## 方法 |
| 33 | + |
| 34 | + |
| 35 | +## code |
| 36 | + |
| 37 | +### js |
| 38 | + |
| 39 | +```js |
| 40 | +let numDecodings = s => { |
| 41 | + if (s === null || s.length === 0) |
| 42 | + return 0; |
| 43 | + let n = s.length; |
| 44 | + let dp = Array(n + 1).fill(0); |
| 45 | + dp[0] = 1; |
| 46 | + dp[1] = s[0] === '0' ? 0 : 1; |
| 47 | + for (let i = 2; i <= n; i++) { |
| 48 | + let one = parseInt(s.slice(i-1, i)); |
| 49 | + if (one !== 0) |
| 50 | + dp[i] += dp[i-1]; |
| 51 | + if (s[i-2] === '0') |
| 52 | + continue; |
| 53 | + let two = parseInt(s.slice(i-2, i)); |
| 54 | + if (two <= 26) |
| 55 | + dp[i] += dp[i-2]; |
| 56 | + } |
| 57 | + return dp[n]; |
| 58 | +} |
| 59 | +``` |
| 60 | + |
| 61 | +### go |
| 62 | + |
| 63 | +```go |
| 64 | +func numDecodings(s string) int { |
| 65 | + if len(s) == 0 { |
| 66 | + return 0 |
| 67 | + } |
| 68 | + n := len(s) |
| 69 | + dp := make([]int, n+1) |
| 70 | + dp[0] = 1 |
| 71 | + if s[0] == '0' { |
| 72 | + dp[1] = 0 |
| 73 | + } else { |
| 74 | + dp[1] = 1 |
| 75 | + } |
| 76 | + for i := 2; i <= n; i++ { |
| 77 | + one, _ := strconv.Atoi(s[i-1:i]) |
| 78 | + if one != 0 { |
| 79 | + dp[i] += dp[i-1] |
| 80 | + } |
| 81 | + if s[i-2] == '0' { |
| 82 | + continue |
| 83 | + } |
| 84 | + two, _ := strconv.Atoi(s[i-1:i]) |
| 85 | + if two <= 26 { |
| 86 | + dp[i] += dp[i-2] |
| 87 | + } |
| 88 | + } |
| 89 | + return dp[n] |
| 90 | +} |
| 91 | +``` |
| 92 | + |
| 93 | +### java |
| 94 | + |
| 95 | +```java |
| 96 | +class Solution { |
| 97 | + public int numDecodings(String s) { |
| 98 | + if (s == null || s.length() == 0) |
| 99 | + return 0; |
| 100 | + int n = s.length(); |
| 101 | + int[] dp = new int[n + 1]; |
| 102 | + dp[0] = 1; |
| 103 | + dp[1] = s.charAt(0) == '0' ? 0 : 1; |
| 104 | + for (int i = 2; i <= n; i++) { |
| 105 | + int one = Integer.valueOf(s.substring(i - 1, i)); |
| 106 | + if (one != 0) |
| 107 | + dp[i] += dp[i - 1]; |
| 108 | + if (s.charAt(i - 2) == '0') |
| 109 | + continue; |
| 110 | + int two = Integer.valueOf(s.substring(i - 2, i)); |
| 111 | + if (two <= 26) |
| 112 | + dp[i] += dp[i - 2]; |
| 113 | + } |
| 114 | + return dp[n]; |
| 115 | + } |
| 116 | +} |
| 117 | +``` |
| 118 | + |
0 commit comments