解题思路
1、对字符串化后的数字进行遍历。
2、第i(i>1)位数字有两种状态:
(1) 可以与第i-1位组合成数字x,且 10 <= x <= 25,
其中 x = num(i-1)*10 + num(i)。
(2) 可以与第i-1位组合成数字x,但 x <= 10 或 x >= 26,
其中 x = num(i-1)*10 + num(i)。
3、我们把 10 <= x <= 25 时的状态定义为组合状态,另一种称为非组合状态。
4、设 dp[] 为状态转移矩阵,其中 dp[i] 代表在第 i 位前组合状态的和。
5、状态转移方程:
(1) 当 i 处于第一种状态时,其组合状态为 i-1 时的组合状态和 + 1,
同时,由于 i-2 时的组合状态与 i 时不存在冲突,
如1213 中 12 和 13 没有重叠位,因此不存在冲突。
因此 i-2 中的任意一种组合均可与当前组合同时存在形成一种新的序列组合。
故 dp[i] = dp[i-1] + 1 + dp[i-2] * 1。
(2) 当 i 处于第二种状态时,其组合状态为 i-1 时的组合状态和,
即 dp[i] = dp[i-1]。
6、边界条件:
(1) 当 i = 1 时,其前方没有可组合数字,因此 dp[1] = 0。
(2) 当 i = 2 时,若其与 i = 1 可组合,又因为其组合前方无数字,
因此不存在组合,故 dp[0] = 0。
代码
class Solution:
def translateNum(self, num: int) -> int:
num = str(num)
n = len(num)
dp = [0]*(n+1)
for i in range(2, n+1):
now = (ord(num[i-2]) - ord('0'))*10 + (ord(num[i-1]) - ord('0'))
dp[i] = dp[i-1] + 1 + dp[i-2] if 10 <= now < 26 else dp[i-1]
return dp[n] + 1