AcWing练习——把数字翻译成字符串(动态规划)
题目描述:
给定一个数字,我们按照如下规则把它翻译为字符串:
0翻译成 a
,1翻译成 b
,……,11翻译成 i
,……,25翻译成 z
。
一个数字可能有多个翻译。例如 “12258“有种不同的翻译,它们分别是 bccfi
、bwfi
、bczi
、mcfi
和 mzi
。
请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。
样例
输入:"12258"
输出:5
本题解法
DP O(N)
还记得经典的爬楼梯(斐波那契数列)吗?每次可以走1步或者2步,问n个台阶一共有多少种爬楼梯的方法?
dp[i]=dp[i-1]+dp[i-2]
这道题相当于加了一些限制条件。
这个题可以正推或者倒推,我采用的方法是倒着推
以dp[i]表示从字符串i位开始到末尾,最大的翻译次数。
dp[i] = dp[i+1] // default, 比如都是67876878,这种只有1种解码方式,不会增加 = dp[i+1] + dp[i+2] // when s[i]=='1'||(s[i]=='2'&&s[i+1]<'6') 这种情况的出现会使解码次数增加举个例子12xxxxxx;将1作为单独的一个数看,解码方法和2xxxxxx相同;将12作为一个整体看,解码方法数量和xxxxxx相同。最终的数量是二者之和。
AC代码:
1 class Solution { 2 public int getTranslationCount(String s) { 3 char[] c = s.toCharArray(); 4 int n = c.length; 5 int[] dp = new int[n + 2]; 6 7 dp[n] = 1; 8 for (int i = n - 1; i >= 1; i--) { 9 // 一开始默认就等于后面那个位置的dp值 10 dp[i] = dp[i + 1]; 11 if (c[i - 1] == '1' || (c[i - 1] == '2' && c[i] < '6')) { 12 if (i + 2 <= n) { 13 dp[i] += dp[i + 2]; 14 } else { 15 dp[i] += 1; 16 } 17 } 18 } 19 return dp[1]; 20 } 21 }