题解 | JZ46 把数字翻译成字符串
这个题可以看作是带约束的走台阶一共有多少种走法。
转移方程为:
f[i] = f[i-1](nums[i]!='0') + f[i-2](nums[i-1] == '1' or (nums[i-1] == '2' and nums[i] <= '6'))
class Solution {
public:
/**
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
int solve(string nums) {
// write code here
int dp[nums.size()];
memset(dp, 0, sizeof(dp));
if (nums[0] == '0') return 0;
dp[0] = 1;
for (int i = 1; i < nums.size(); ++i) {
if (i == 1) {
if (nums[i-1] == '1') {
if (nums[i] == '0') dp[i] = 1;
else dp[i] =2;
}
else if (nums[i-1]=='2') {
if (nums[i] <= '6') dp[i] = 2;
else dp[i] = 1;
} else {
dp[i] = 1;
}
}
else {
if (nums[i] != '0') dp[i] = dp[i-1];
if (nums[i-1]=='1' || (nums[i-1]=='2' && nums[i] <= '6')) {
dp[i] += dp[i-2];
}
}
}
return dp[nums.size()-1];
}
};
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 解码
# @param nums string字符串 数字串
# @return int整型
#
class Solution:
def solve(self , nums: str) -> int:
# write code here
dp = [0] * len(nums)
if nums[0] == '0': return 0
dp[0] = 1
for i in range(1, len(nums)):
if i == 1:
if nums[i-1] == '1':
if nums[i] == '0':
dp[i]=1
else:
dp[i]=2
elif nums[i-1] == '2':
if nums[i] <= '6':
dp[i]=2
else:
dp[i]=1
else:
dp[i]=1
else:
if nums[i] != '0':
dp[i] = dp[i-1]
if (nums[i-1] == '1') or (nums[i-1]=='2' and nums[i] <='6'):
dp[i] += dp[i-2]
return dp[len(nums)-1]