给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
第一次做; 递归, 核心:1)设递归函数f(i)表示以chs[i]开头的不同的翻译数量; 2) 使用memo数组记录已处理过的结果, 避免重复子问题的计算
class Solution { public int translateNum(int num) { String s = String.valueOf(num); return core(s, 0); } private int core(String s, int i) { int n = s.length(); if (i == n) { return 1; } if (i > n) { return 0; } int res = 0; res += core(s, i + 1); if (i + 1 < n && (s.substring(i, i + 2).compareTo("25") <= 0 && s.substring(i, i + 2).compareTo("10") >= 0)) { res += core(s, i + 2); } return res; } }
动态规划解法:
class Solution { public int translateNum(int num) { String s = String.valueOf(num); int len = s.length(); if (len < 2) { return len; } char[] charArray = s.toCharArray(); //dp[i]: s[0..i] 能翻译的种类 int[] dp = new int[len]; dp[0] = 1; for (int i = 1; i < len; i++) { dp[i] = dp[i - 1]; int cuurentNum = 10 * (charArray[i - 1] - '0') + (charArray[i] - '0'); if (cuurentNum > 9 && cuurentNum < 26) { if (i - 2 < 0) { dp[i]++; } else { dp[i] += dp[i - 2]; } } } return dp[len - 1]; } }