剑指 Offer 46. 把数字翻译成字符串
思路:动态规划
对于一个数字x1x2……xi,它的翻译方法 f( i ) 可以分为两种情况,xi-1和xi单独翻译和整体翻译。
当xi-1和xi单独翻译时,f( i ) = f ( i - 1 ) + f( i - 2 )
当xi-1和xi整体翻译时,f( i ) = f( i - 1 )
设动态规划列表 dp ,dp[ i ] 代表以 xi 为结尾的数字的翻译方法数量。
可推出当xi-1和xi满足组成数字在区间[10, 25]之间时,dp[ i ] = dp[ i - 1] + dp[ i - 2]
其它区间dp[ i ] = dp[ i - 1 ].
由此递推公式,遍历字符串来获取数字,代码如下:
时间复杂度O(n),空间复杂度O( n)
class Solution { public int translateNum(int num) { String str = String.valueOf(num); int[] dp = new int[str.length()]; dp[0] = 1; for (int i = 1; i < str.length(); i++) { String tmp = str.substring(i-1, i+1); if (tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0) { if (i == 1){ dp[i] = 2; } else { dp[i] = dp[i-1] + dp[i-2]; } } else { dp[i] = dp[i-1]; } } return dp[str.length()-1]; } }