File tree Expand file tree Collapse file tree 1 file changed +78
-0
lines changed Expand file tree Collapse file tree 1 file changed +78
-0
lines changed Original file line number Diff line number Diff line change
1
+ #### 91. 解码方法
2
+
3
+ 难度:中等
4
+
5
+ ---
6
+
7
+ 一条包含字母 ` A-Z ` 的消息通过以下映射进行了 ** 编码** :
8
+
9
+ ```
10
+ 'A' -> "1"
11
+ 'B' -> "2"
12
+ ...
13
+ 'Z' -> "26"
14
+ ```
15
+
16
+ 要 ** 解码** 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,` "11106" ` 可以映射为:
17
+
18
+ * ` "AAJF" ` ,将消息分组为 ` (1 1 10 6) `
19
+ * ` "KJF" ` ,将消息分组为 ` (11 10 6) `
20
+
21
+ 注意,消息不能分组为 ` (1 11 06) ` ,因为 ` "06" ` 不能映射为 ` "F" ` ,这是由于 ` "6" ` 和 ` "06" ` 在映射中并不等价。
22
+
23
+ 给你一个只含数字的 ** 非空** 字符串 ` s ` ,请计算并返回 ** 解码** 方法的 ** 总数** 。
24
+
25
+ 题目数据保证答案肯定是一个 ** 32 位** 的整数。
26
+
27
+ ** 示例 1:**
28
+
29
+ ```
30
+ 输入:s = "12"
31
+ 输出:2
32
+ 解释:它可以解码为 "AB"(1 2)或者 "L"(12)。
33
+ ```
34
+
35
+ ** 示例 2:**
36
+
37
+ ```
38
+ 输入:s = "226"
39
+ 输出:3
40
+ 解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
41
+ ```
42
+
43
+ ** 示例 3:**
44
+
45
+ ```
46
+ 输入:s = "06"
47
+ 输出:0
48
+ 解释:"06" 无法映射到 "F" ,因为存在前导零("6" 和 "06" 并不等价)。
49
+ ```
50
+
51
+ ** 提示:**
52
+
53
+ * ` 1 <= s.length <= 100 `
54
+ * ` s ` 只包含数字,并且可能包含前导零。
55
+
56
+ ---
57
+
58
+ 动态规划:
59
+
60
+ ` dp[i] ` 指前 ` i ` 个数可行的总数。初始化 ` dp[0] = 1 ` ,状态转移方程为 $dp[ i] = \left\{ \begin{array}{rcl} dp[ i] += dp[ i - 1] & dp[ i - 1] != '0' \\ dp[ i] += dp[ i - 2] & dp[ i - 2] != '0' \&\& num <= 26 \end{array}\right.$
61
+
62
+ ``` Java
63
+ class Solution {
64
+ public int numDecodings (String s ) {
65
+ int n = s. length();
66
+ int [] dp = new int [n + 1 ];
67
+ dp[0 ] = 1 ;
68
+ for (int i = 1 ; i <= n; i++ ){
69
+ if (s. charAt(i - 1 ) != ' 0' ) dp[i] += dp[i - 1 ];
70
+ if (i > 1 && s. charAt(i - 2 ) != ' 0' ){
71
+ int temp = (s. charAt(i - 2 ) - ' 0' ) * 10 + s. charAt(i - 1 ) - ' 0' ;
72
+ if (temp <= 26 ) dp[i] += dp[i - 2 ];
73
+ }
74
+ }
75
+ return dp[n];
76
+ }
77
+ }
78
+ ```
You can’t perform that action at this time.
0 commit comments