当前位置:  首页>> 技术小册>> 数据结构与算法(下)

题目描述

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

0 翻译成 ”a”,1 翻译成 ”b”,……,11 翻译成 ”l”,……,25 翻译成 ”z”。

一个数字可能有多个翻译。例如 12258 有 5 种不同的翻译,它们分别是 ”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。

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

解法

先写入递推式,res 表示共有多少种翻译方法。看最后一个字符,判断它与前一个字符能否构成有效翻译,计算 res[i]:

  • 能,那么 res[i] = res[i - 1] + res[i - 2]
  • 不能,那么 res[i] = res[i - 1]
  1. /**
  2. * @author bingo
  3. * @since 2018/12/8
  4. */
  5. class Solution {
  6. /**
  7. * 获取翻译字符串的方法个数
  8. *
  9. * @param s 字符串
  10. * @return 个数
  11. */
  12. public int getTranslationCount(String s) {
  13. if (s == null || s.length() < 2) {
  14. return 1;
  15. }
  16. char[] chars = s.toCharArray();
  17. int n = chars.length;
  18. int[] res = new int[n];
  19. res[0] = 1;
  20. res[1] = isInRange(chars[0], chars[1]) ? 2 : 1;
  21. for (int i = 2; i < n; ++i) {
  22. res[i] = res[i - 1] + (isInRange(chars[i - 1], chars[i]) ? res[i - 2] : 0);
  23. }
  24. return res[n - 1];
  25. }
  26. private boolean isInRange(char a, char b) {
  27. int s = (a - '0') * 10 + (b -'0');
  28. return s >= 10 && s <= 25;
  29. }
  30. }

测试用例

  1. 功能测试(只有一位数字;包含多位数字);
  2. 特殊输入测试(负数;0;包含 25、26 的数字)。

该分类下的相关小册推荐: