AcWing练习——把数字翻译成字符串(动态规划)

题目描述:

给定一个数字,我们按照如下规则把它翻译为字符串:

0翻译成 a1翻译成 b,……,11翻译成 i,……,25翻译成 z

一个数字可能有多个翻译。例如 “12258“种不同的翻译,它们分别是 bccfibwfibczimcfimzi

请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。

样例

输入:"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 }

 

posted @ 2021-03-25 12:15  没有你哪有我  阅读(51)  评论(0编辑  收藏  举报