参考
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]
}
京公网安备 11010502036488号