前言
这是笔者在LintCode社区刷题的经历,希望思考的过程对读者有所帮助
解码方法
题目描述:
有一个消息包含A-Z通过以下规则编码
‘A’ -> 1 直到 ‘Z’ -> 26
现在给你一个加密过后的消息,问有几种解码的方式
实例:
12 : 1|2 代表AB,12代表L,共两种情况
思路:
首先排除特殊情况:
①若输入的String为“”,则结果为0
②若输入的String位数为1,则结果为1
然后是思路,也就是动态规划的自底向上实现:
①我们假设有数字串1232435,已知当前结果为X,则在后续插入5,变成12324355,结果会如何?
我们有且只有两种分法: 1232435|5 123243|55
前者结果也为X,而后者结果为0,因为55显然无法对应一个英文字母(在这里我们不关心1232435的X中方法具体是什么,因为满足无后效性,也就是可以动态规划解决),此时结果为X+0 = X.
②同样的,如果是12321,后续插入1,则分为两种情况:
12321|1 1232|11
也就是说,我们可以得出前四位的最佳解 + 前五位的最佳解 = 第六位最佳解!(仅当56位的数字合起来属于1-26之间)
实现中的漏洞:
实现中发现了一个格格不入的数字 0
当0出现时,只能搭配成10或者20,且(敲黑板)重要的是,10,20将整个数字隔开了!!
举个栗子123345103242