参考
https://blog.nowcoder.net/n/f63df8c29d654958b52cb85878f08330

package main


// 当前字符不等于0的时候,dp[i] = dp[i-1],此时将当前位置的一个字符译码
// 当前字符+前一个字符,记为num, 如果 10<=num<=26 此时符合两个合并一起译码的条件;
// 若此时i等于1,直接dp[i]++;
// 大于1, 则dp[i] += dp[i-2];
// 
// 举个例子: nums = "324"
// 此时dp[0] = 1, dp[1]呢? dp[2]呢?
// 很明显nums[1] != '0',所以dp[1] = dp[0],num = 32,
// 此时不满足两个一起译码的条件则循环往下执行,此时 nums[2] != '0',
// 则 dp[2] = dp[1] = 1, num = 24,此时满足两个一起译码的条件,因为i==2大于1,
// 所以dp[2] += dp[2-2] ,dp[2] = 1+1 = 2

/**
 * 解码
 * @param nums string字符串 数字串
 * @return int整型
*/
func solve( nums string ) int {
    // write code here
    if len(nums)==0 || nums[0] == '0' {
        return 0
    }

//   表示字符串nums中 以i个位置结尾的前缀字符串的解码种数
    dp := make([]int, len(nums))
    // 第一个字符不为0
    //  由于只有一个值(1-9之间),所以,只有一种编码
    //  在第0个字符的时候只有一个字母所以只有一种翻译办法
    dp[0] = 1

    // 填充剩余dp数组
    for i:=1; i<len(dp); i++{
        // 当前字符不等于0的时候,dp[i] = dp[i-1]
        // 此时将当前位置的一个字符译码
        if nums[i] != '0' {
            dp[i] = dp[i-1]
        }

        // 当前字符与前面一个字符组成的数值
        num := (nums[i-1]-'0')*10 + nums[i]-'0'
        if num >=10 && num <=26 {
            // 第二个字符,特殊处理
            if i==1{
                dp[i] +=1
            }else{
                // 由于前面  dp[i] = dp[i-1]
                // 所以此时相当于 dp[i] = dp[i-1] + dp[i-2]
                dp[i] += dp[i-2]
            }
        }
    }

    return dp[len(nums)-1]
}