Python映射转换多少种字符串题目的解答

编辑:光环大数据 来源: 互联网 时间: 2017-11-13 14:31 阅读:

  现在有如下的字母与数字的对应关系:1-A,2-B,…26-Z。给定一个由数字组成的字符串,判断按照上面的映射可以转换成多少种不同的字符串。

解题思路

动态规划

解码有多少种方法。一般求“多少”我们考虑使用dp。状态方程如下:

当s[i-2:i]这两个字符是10~26但不包括10和20这两个数时,比如21,那么可以有两种编码方式(BA,U),所以dp[i]=dp[i-1]+dp[i-2]

当s[i-2:i]等于10或者20时,由于10和20只有一种编码方式,所以dp[i]=dp[i-2]

当s[i-2:i]不在以上两个范围时,如09这种,编码方式为0,而31这种,dp[i]=dp[i-1]。

注意初始化时:dp[0]=1,dp[1]=1

举个例子:

123421

[1,1]12

[1,1,2]23

[1,1,2,3]34

[1,1,2,3,3]42

[1,1,2,3,3,3]21

首先12,有两种可能,所以dp[3]=1+1

然后23,两种可能,所以1+2=3

然后34,从全局看,123多了4之后由于不能和前面的组成新组合,只能自己独立,所以可能输并不会变化

42和34一样理解,不增加新可能。

到了21,由于其有两种可能,那么使得之前的都会累积成为新变种,所以是dp[i]=dp[i-1]+dp[i-2],这一步是最重要的

代码

classSolution(object):

defnumDecodings(self,s):

"""

:types:str

:rtype:int

"""

ifs==""ors[0]=="0":

return0

iflen(s)==1:

return1

dp=[1,1]

foriinrange(2,len(s)+1):

#printdp,s[i-2:i]

if10<=int(s[i-2:i])<=26ands[i-1]!='0':#当s[i-2:i]这两个字符是10~26但不包括10和20这两个数时,比如21,那么可以有两种编码方式(BA,U),所以dp[i]=dp[i-1]+dp[i-2]

dp.append(dp[i-1]+dp[i-2])

elifint(s[i-2:i])==10orint(s[i-2:i])==20:

dp.append(dp[i-2])#当s[i-2:i]等于10或者20时,由于10和20只有一种编码方式,所以dp[i]=dp[i-2]

elifs[i-1]!='0':#

dp.append(dp[i-1])#当s[i-2:i]不在以上两个范围时,如09这种,编码方式为0,而31这种,dp[i]=dp[i-1]

else:

return0

returndp[-1]

 

       Python培训Python培训班Python培训机构,就选光环大数据!


大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服

你可能也喜欢这些

在线客服咨询

领取资料

X
立即免费领取

请准确填写您的信息

点击领取
#第三方统计代码(模版变量) '); })();
'); })();