动态规划代码1:
- dp[i] 表示前 i 个字符的方法总数
- 状态转移:如果把当前字符单独来看,则
f[i] = f[i-1] - 如果和前面的字符当成整体来看则
f[i] = f[i-2] - 所以当前状态就等于
f[i-1] + f[i-2],也就是步骤2和步骤3的状态总和 - 当然,进行状态转移时,要各自满足状态转移的条件
func numDecodings(s string) int {
n := len(s)
f := make([]int, n+1)
f[0] = 1
for i := 1; i <= n; i++ {
if s[i-1] != '0' {
f[i] += f[i-1]
}
if i > 1 && s[i-2] != '0' && ((s[i-2]-'0')*10+(s[i-1]-'0') <= 26) {
f[i] += f[i-2]
}
}
return f[n]
}
代码2优化:
因为状态转移只与前两个dp状态有关,所以可以只存前两个值即可
func numDecodings(s string) int {
n := len(s)
a, b, c := 0, 1, 0
for i := 1; i <= n; i++ {
c = 0
if s[i-1] != '0' {
c += b
}
if i > 1 && s[i-2] != '0' && ((s[i-2] - '0') * 10 + s[i-1] - '0') <= 26 {
c += a
}
a = b
b = c
}
return c
}