解码方法——动态规划

116 阅读1分钟

image.png

动态规划代码1:

  1. dp[i] 表示前 i 个字符的方法总数
  2. 状态转移:如果把当前字符单独来看,则f[i] = f[i-1]
  3. 如果和前面的字符当成整体来看则 f[i] = f[i-2]
  4. 所以当前状态就等于f[i-1] + f[i-2],也就是步骤2和步骤3的状态总和
  5. 当然,进行状态转移时,要各自满足状态转移的条件
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
}