动态规划
class Solution:
def __init__(self):
self.arr = [str(i) for i in range(1, 27)]
def judge(self, x):
if x in self.arr:
return True
return False
def numDecodings(self, s: str) -> int:
if s[0] == '0':
return 0
size = len(s)
dp = [1] * size
for i in range(1, size):
if s[i] == '0':
if not self.judge(s[i - 1] + s[i]):
return 0
dp[i] = dp[i - 2]
else:
if self.judge(s[i - 1] + s[i]):
dp[i] = dp[i - 1] + dp[i - 2]
else:
dp[i] = dp[i - 1]
return dp[size - 1]
太难了。。
不想写dp[1]的情况,要判断很多(还是写了),就导致一个问题,从1开始遍历的话会导致i-2小于0,但是这里正好把dp初始值全部设为了1,当i-2为-1时,dp[-1]值为1,正好可以少写点分支判断i情况
正常版👇
class Solution:
def __init__(self):
self.arr = [str(i) for i in range(1, 27)]
def judge(self, x):
if x in self.arr:
return True
return False
def numDecodings(self, s: str) -> int:
if s[0] == '0':
return 0
size = len(s)
if size == 1:
return 1
dp = [0] * size
dp[0] = 1
if not self.judge(s[1]) and self.judge(s[0] + s[1]):
dp[1] = 1
elif self.judge(s[1]) and not self.judge(s[0] + s[1]):
dp[1] = 1
elif self.judge(s[1]) and self.judge(s[0] + s[1]):
dp[1] = 2
else:
return 0
for i in range(2, size):
if s[i] == '0':
if not self.judge(s[i - 1] + s[i]):
return 0
dp[i] = dp[i - 2]
else:
if self.judge(s[i - 1] + s[i]):
dp[i] = dp[i - 1] + dp[i - 2]
else:
dp[i] = dp[i - 1]
return dp[size - 1]