L91 Decode Ways
#O(n)
class Solution(object):
def numDecodings(self, s):
"""
:type s: str
:rtype: int
"""
if s == '' or s == '0' or s[0] == '0':
return 0
dp = [1, 1]
# '1261'
# i: 0 1 2 3 4
#dp =1 1 2 3 3
#idx 0 1 2 3
#str= 1 2 6 1
for i in range(2, len(s) + 1):
if int(s[i-2:i]) >= 10 and int(s[i-2:i]) <= 26 and s[i-1] != '0': #
dp.append(dp[i-2] + dp[i-1])
elif int(s[i-2:i]) == 10 or int(s[i-2:i]) == 20:
dp.append(dp[i-2])
elif s[i-1] != '0':
dp.append(dp[i-1])
else:
return 0
return dp[len(s)]
#dp =1 1 2 3 3
#str= 1 2 6 1
class Solution(object):
def numDecodings(self, s):
"""
:type s: str
:rtype: int
"""
if s == '' or s[0] == '0':
return 0
dp = [1, 1]
# '1261'
for i in range(1, len(s)):
if int(s[i-1:i+1]) >= 10 and int(s[i-1:i+1]) <= 26 and s[i] != '0':
dp.append(dp[i-1] + dp[i])
elif int(s[i-1:i+1]) == 10 or int(s[i-1:i+1]) == 20:
dp.append(dp[i-1])
elif s[i] != '0':
dp.append(dp[i])
else:
return 0
return dp[len(s)]
class Solution:
def numDecodings(self, s):
"""
:type s: str
:rtype: int
"""
MOD = 10 ** 9 + 7
N = len(s)
dp = [0] * (N+1)
dp[0] = 1
if s[0] == '*':
dp[1] = 9
else:
dp[1] = 1 if s[0] != '0' else 0
for i in range(1, N):
if s[i] == '*':
dp[i+1] = 9 * dp[i] % MOD
if s[i-1] == '1':
dp[i+1] = (dp[i+1] + 9 * dp[i-1]) % MOD
elif s[i-1] == '2':
dp[i+1] = (dp[i+1] + 6 * dp[i-1]) % MOD
elif s[i-1] == '*':
dp[i+1] = (dp[i+1] + 15 * dp[i-1]) % MOD
else:
dp[i+1] = dp[i] if s[i] != '0' else 0
if s[i-1] == '1':
dp[i+1] = (dp[i+1] + dp[i-1]) % MOD
elif s[i-1] == '2' and int(s[i]) <= 6:
dp[i+1] = (dp[i+1] + dp[i-1]) % MOD
elif s[i-1] == '*':
if int(s[i]) <= 6:
dp[i+1] = (dp[i+1] + 2 * dp[i-1]) % MOD
else:
dp[i+1] = (dp[i+1] + dp[i-1]) % MOD
return dp[-1]
def decode(code): # bitwise or
def helper(prefix, code, s):
# base case
if len(code) == 0:
s.add(prefix)
return s
if code[0] == '0':
return s
# 1 char, if code[0] == '1'
s |= helper(prefix + chr(int(code[0]) - 1 + ord('A')), code[1:], s)
# 2 chars, if code[0:2] available
if len(code) >= 2 and code[0] == '1': # '10' <= code[0:2] <= '19'
s |= helper(prefix + chr(int(code[:2]) - 1 + ord('A')), code[2:], s)
if len(code) >= 2 and '20' <= code[0:2] <= '26':
s |= helper(prefix + chr(int(code[:2]) - 1 + ord('A')), code[2:], s)
return s
s = set()
return helper("", code, s)
code = "126"
print (decode(code))
Last updated
Was this helpful?