这题说实话感觉不是很难,但是不知道面试如果不用编译器写的话结果如何。
有两个非常tricky的地方。就是0这个东西。 0理论上是不能存在的,因为没有对应的字母。但是如果是10这种 0就还是能存在。我做了一个判断,首字母为0肯定不行。然后单字母为0的时候直接返回,不计算这组String。
还有一个比较Tricky的地方:我之前backtrack做太多了,每次都是习惯性的写
for(int i=0; i<..; i++)
recursion.
但是这道题并不能这么做。之前那么做比如是找到首字母为i=0, i=1, i=2...i=100的不同开始的组合。但是这题开始的只能2种情况。比如"1234" 要么1开始然后加上DFS(“234”)的组合 要么"12"开始,加上DFS(“34”)的组合
看来我对DFS还是太依靠刷题,总结太少。。
最后还是Time out了,不过面试中问题我觉得不是太大。
看了下discussion。。发现清一色的DP solution
而且,所有答案基本上都没有用到hash-map存储digit--letter. 然后我就我操了, 其实根本不用关心对应的encoding是什么,我们只要知道有几种encoding组合。
数字 1---9肯定只有1种组合。 10--26的数字 可以有一种或两种encoding的组合。
Subproblem还挺好看出来的,DP[0] 代表input没有digit, DP[1] 代表input只有1个digit。但是怎么找出Subproblem之间的联系还挺难的。
看了网上一个教程,对DP又有了一点新的感悟。DP写的过程中不要挑最simple的case,挑一个比较general的case,假设到了Final Step,前面都已经magically 做好的情况。这样可以看出relationship.
Edit on 8月8:
因为又是问解的数量,所以应该马上想到DP。
特殊情况,之前一个数如果是0.
1204 04不能作为一个整体。
转移方程=
推理转移方程的过程真的是DP的核心。我一直觉得这题好难推,【同样难推的还有Unique Binary Search Tree那题】