leetCode 91:Decode Ways (python)

问题描述

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:
    '''
    解题思路:令matrix[i]表示输入的字符串str[0,i)(不包括i!)的组合情况,
    则matrix[i]可以由之前的值的情况(matrix[i-1],matrix[i-2],matrix[i-3]...)推断而来
    字母的数字表示范围为:1-26,因此,需要考虑matrix[i-1],matrix[i-2]的情况
    1、当数字str[i-1],str[i-2]str[i-1]都不能正确的表示一个字母,说明整个字符串也不能匹配任何字母,返回0(例如80)
    2、当数字str[i-1]可以表示一个字母,但是str[i-2]str[i-1]不能表示一个字母,matrix[i] = matrix[i-1] (例如83)
    3、当数字str[i-1]不能表示一个字母,但是str[i-2]str[i-1]可以表示一个字母,matrix[i] = matrix[i-2] (例如20)
    4、当数字str[i-1]可以表示一个字母,但是str[i-2]str[i-1]也可以表示一个字母,matrix[i] = matrix[i-2] + matrix[i-1](例如12)
    '''
    def numDecodings(self, s: str) -> int:       
        '''
        如果输入的数字第一位是0,则匹配不上任何字母
        '''
        if(int(s[0]) == 0 ):  return 0  
        '''
        初始化地推数组
        '''
        length = len(s)
        matrix = [ 0 for i in range(length +1) ]            
        matrix[0] = matrix[1] = 1        
        flag1 = flag2 =True
       
        for i in range(2, length+1):
            if int(s[i-1]) == 0 : flag1 =False 
            else :  flag1=True
            if int(s[i-2]) == 0 or (int(s[i-2])*10+int(s[i-1]) )  >26 : flag2=False 
            else: flag2=True
            if  flag1 == False and  flag2 == False :
                return 0
            elif flag1 == False and flag2== True :
                matrix[i] = matrix[i-2] 
            elif flag1 == True and flag2 == False :
                matrix[i] = matrix[i-1]       
            else:
                matrix[i]=matrix[i-1]+matrix[i-2]        
        return matrix[length]   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值