LeetCode 91 Decode Ways (Python详解及实现)

【题目】

Amessage containing letters from A-Z is being encoded to numbers using thefollowing mapping:

 

'A'-> 1

'B'-> 2

...

'Z'-> 26

Given anencoded message containing digits, determine the total number of ways to decodeit.

 

Forexample,

Givenencoded message "12", it could be decoded as "AB" (1 2) or"L" (12).

 

Thenumber of ways decoding "12" is 2.

 

按照编码规则将信息中的字母进行编码,给定一个编码过的信息,返回解码的方法总数。

 例如:“12”---->2种[“AB”,“L”]

 

【思路】

本题宜用动态规划:

共有三种情况:

l  s[i-2]和s[i-1] 两个字符是10----26之间但不包括10和20这两个数时,有两种编码方式,比如23------>[“BC”,“W”],所以dp[i] = dp[i-1]+dp[i-2]

l  s[i-2]和s[i-1] 两个字符10或20这两个数时,有一种编码方式,比如10------>[“J”], 所以dp[i] = dp[i-2]

l  s[i-2]和s[i-1] 两个字符不在上述两种范围时,编码方式为零,比如27,比如01,所以dp[i] = dp[i-1]

 

【Python实现】

 

# -*- coding: utf-8 -*-
"""
Created on Thu Aug 10 09:22:16 2017
 
@author: Administrator
"""
 
class Solution(object):
    def numDecodings(self, s):
       """
       :type s: str
       :rtype: int
       """
       if s=="" or s[0]=='0': return 0
       dp=[1,1]
       for i in range(2,len(s)+1):
           if 10 <=int(s[i-2:i]) <=26 and s[i-1]!='0':#编码方式为2
                dp.append(dp[i-1]+dp[i-2])
           elif int(s[i-2:i])==10 or int(s[i-2:i])==20:#编码方式为1
                dp.append(dp[i-2])
           elif s[i-1]!='0':#编码方式为0
                dp.append(dp[i-1])
           else:
                return 0
       #print(dp[len(s)])
       return dp[len(s)]
 
 
if __name__ == '__main__':
   S= Solution()
    s= "1220"
   S.numDecodings(s)


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值