Skip to content

Commit 553d98f

Browse files
aQuaaQua
aQua
authored and
aQua
committed
91 finish
1 parent 4fac50c commit 553d98f

File tree

1 file changed

+28
-29
lines changed

1 file changed

+28
-29
lines changed

Algorithms/0091.decode-ways/decode-ways.go

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,55 +6,54 @@ func numDecodings(s string) int {
66
return 0
77
}
88

9-
if n == 1 {
10-
return waysOfOne(s)
11-
}
12-
139
dp := make([]int, n+1)
14-
dp[0], dp[1] = 1, waysOfOne(s[0:1])
10+
// dp[i] 表示 s[:i+1] 的组成方式数
11+
dp[0], dp[1] = 1, one(s[0:1])
1512

1613
for i := 2; i <= n; i++ {
17-
w1, w2 := waysOfOne(s[i-1:i]), waysOfTwo(s[i-2:i])
18-
switch {
19-
case w1 == 0 && w2 == 0:
14+
w1, w2 := one(s[i-1:i]), two(s[i-2:i])
15+
dp[i] = dp[i-1]*w1 + dp[i-2]*w2
16+
if dp[i] == 0 {
17+
// 子字符串 s[:i+1] 的组成方式数为 0
18+
// 则,s 的组成方式数肯定也为 0
19+
// 这时可以提前结束
2020
return 0
21-
case w2 == 2:
22-
dp[i] = dp[i-1] + dp[i-2]
23-
case w1 == 0: // w2 == 1
24-
dp[i] = dp[i-2]
25-
case w2 == 0: // w1 == 1
26-
dp[i] = dp[i-1]
2721
}
2822
}
2923

3024
return dp[n]
3125
}
3226

33-
func waysOfOne(s string) int {
27+
// 检查 s 是否为合格的单字符
28+
// len(s) == 1
29+
// 合格, 返回 1
30+
// 不合格, 返回 0
31+
// 注意:
32+
// 题目保证了 s 只含有数字
33+
func one(s string) int {
3434
if s == "0" {
3535
return 0
3636
}
3737
return 1
3838
}
3939

40-
func waysOfTwo(s string) int {
41-
switch {
42-
case '3' <= s[0] && s[0] <= '9':
43-
return 0
44-
case s[0] == '2':
40+
// 检查 s 是否为合格的双字符
41+
// len(s) == 2
42+
// 合格, 返回 1
43+
// 不合格, 返回 0
44+
// 注意:
45+
// 题目保证了 s 只含有数字
46+
func two(s string) int {
47+
switch s[0] {
48+
case '1':
49+
return 1
50+
case '2':
4551
if s[1] == '7' || s[1] == '8' || s[1] == '9' {
4652
return 0
4753
}
48-
if s[1] == '0' {
49-
return 1
50-
}
51-
return 2
52-
case s[0] == '1':
53-
if s[1] == '0' {
54-
return 1
55-
}
56-
return 2
54+
return 1
5755
default:
56+
// '3' <= s[0] && s[0] <= '9',或
5857
// s[0] == '0'
5958
return 0
6059
}

0 commit comments

Comments
 (0)