A message containing letters from A-Z
is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given a non-empty string containing only digits, determine the total number of ways to decode it.
Example 1:
Input: "12" Output: 2 Explanation: It could be decoded as "AB" (1 2) or "L" (12).
Example 2:
Input: "226" Output: 3 Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).
动态规划
class Solution:
def numDecodings(self, s: str) -> int:
if s.startswith("0"):
return 0
if len(s)==1:
return 1
dp=[0 for _ in range(len(s))]
dp[0]=1
if s[1]!="0" and "10"<s[0:2]<="26":
dp[1]=2
elif s[1]=="0" :
if "0"<s[0]<="2":
dp[1]=1
else:
dp[1]=1
for i in range(2,len(s)):
if s[i]=="0":
if s[i-1]=="2" or s[i-1]=='1':
dp[i]=dp[i-2]
elif "10"<s[i-1:i+1]<="26":
dp[i]=dp[i-1]+dp[i-2]
else :
dp[i]=dp[i-1]
return dp[len(s)-1]
超出时间限制
class Solution:
def numDecodings(self, s: str) -> int:
if s.startswith("0"):
return 0
return self._numDecoding(s)
def _numDecoding(self,nums):
if not nums:
return 1
if nums=="0":
return 0
if len(nums)==1:
return 1;
res=0
if 1 <= int(nums[0]) <= 9:
res+=self._numDecoding(nums[1:])
if nums[0:2]>="10" and nums[0:2]<="26":
res+=self._numDecoding(nums[2:])
return res
加入index索引
class Solution:
def numDecodings(self, s: str) -> int:
if s.startswith("0"):
return 0
return self._numDecoding(0,s)
def _numDecoding(self,index,nums):
if not nums[index:]:
return 1
if nums[index:]=="0":
return 0
if len(nums[index:])==1:
return 1;
res=0
if 1 <= int(nums[index]) <= 9:
res+=self._numDecoding(index+1,nums)
if nums[index:index+2]>="10" and nums[index:index+2]<="26":
res+=self._numDecoding(index+2,nums)
return res
记忆搜索
class Solution:
def numDecodings(self, s: str) -> int:
if s.startswith("0"):
return 0
memo=[0 for _ in range(len(s))]
return self._numDecoding(0,s,memo)
def _numDecoding(self,index,nums,memo):
if not nums[index:]:
return 1
if nums[index:]=="0":
return 0
if len(nums[index:])==1:
return 1;
if memo[index]!=0:
return memo[index]
memo[index]=0
if 1 <= int(nums[index]) <= 9:
memo[index]+=self._numDecoding(index+1,nums,memo)
if nums[index:index+2]>="10" and nums[index:index+2]<="26":
memo[index]+=self._numDecoding(index+2,nums,memo)
return memo[index]