Java题解 数字翻译成字符串的可能性 | 豆包MarsCode AI刷题

70 阅读2分钟

数字翻译成字符串的可能性

问题描述

小M获得了一个任务,需要将数字翻译成字符串。翻译规则是:0对应"a",1对应"b",依此类推直到25对应"z"。一个数字可能有多种翻译方法。小M需要一个程序来计算一个数字有多少种不同的翻译方法。

例如:数字12258可以翻译成 "bccfi", "bwfi", "bczi", "mcfi" 和 "mzi",共5种方式。

解题思路

题目的意思大致是需要将一个数字翻译成字符串,每个数字对应一个字母(0-25分别对应a-z)。一个数字可能有多种翻译方法,例如数字12258可以翻译成多种字符串。因为要求不同翻译方法的数量,可以使用动态规划(DP)来求解问题。具体思路如下:首先将数字按位转换为数组或列表,方便后续处理。然后使用动态规划数组dpdp,其中dp[i]dp[i]表示前ii个数字的翻译方法有多少种。初始化dp[0]=1dp[0] = 1,表示空字符串有一种翻译方法。遍历处理后的数字列表,对于每个数字,考虑将其单独翻译和与前一个数字组合翻译的情况。如果当前数字和前一个数字组合成的两位数在10102525之间,则可以将其组合翻译。最后dp[n]dp[n]即为答案。

代码:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static int solution(int num) {
        // Please write your code here
        List<Integer> a = new ArrayList<>();
        while (num != 0) {
            a.add(num % 10);
            num /= 10;
        }
        int[] dp = new int[a.size() + 10];
        dp[0] = 1;
        for (int i = 1; i <= a.size(); i++) {
            if (i > 1) {
                dp[i] = dp[i - 1];
                if (a.get(a.size() - i + 1) == 1 || (a.get(a.size() - i + 1) == 2 && a.get(a.size() - i) >= 0 && a.get(a.size() - i) <= 5))
                    dp[i] += dp[i - 2];
            } else
                dp[i] = 1;
        }
        return dp[a.size()];
    }

    public static void main(String[] args) {
        // You can add more test cases here
        System.out.println(solution(12258) == 5);
        System.out.println(solution(1400112) == 6);
        System.out.println(solution(2110101) == 10);
    }
}

代码解析:

首先使用一个ArrayList列表存储数字的每一位,对数字进行循环拆分,低位放在低下标。然后创建dp数组,初始化空字符dp[0]dp[0]对应的值为1。循环从低位遍历数字的每一位,对于当前位的数字,考虑将其单独翻译和与前一个数字组合翻译的情况,如果当前字符单独翻译:dp[i]=dp[i1]dp[i]=dp[i-1],如果当前数字和前一个数字组合:首先判断组合成的两位数是否在10到25之间,若是则dp[i]=dp[i]+dp[i2]dp[i]=dp[i]+dp[i-2],还要注意第一个字符只能单调进行翻译。最后返回dp[n]dp[n]表示答案