Skip to content

Commit bf73852

Browse files
Create 91. 解码方法.md
1 parent 921dd10 commit bf73852

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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+
```

0 commit comments

Comments
 (0)