import java.util.*; /** * NC116 把数字翻译成字符串 * @author d3y1 */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 解码 * @param nums string字符串 数字串 * @return int整型 */ public int solve (String nums) { return solution(nums); } /** * 动态规划 * * dp[i]表示前i位数字的译码种数 * * { 0 , 单双数字均不可译码 * dp[i] = { dp[i-2] , 仅双位数字可以译码 * { dp[i-1] , 仅单位数字可以译码 * { dp[i-1] + dp[i-2] , 单双数字均可以译码 * * @param nums * @return */ private int solution(String nums){ int len = nums.length(); if(len == 0){ return 0; } if(len == 1){ if("0".equals(nums)){ return 0; }else{ return 1; } } int[] dp = new int[len+1]; // 初始化 dp[0] = 1; dp[1] = 1; int dDigit,sDigit; for(int i=2; i<=len; i++){ // 双位数字 double digit dDigit = Integer.parseInt(nums.substring(i-2, i)); // 单位数字 single digit sDigit = Integer.parseInt(nums.substring(i-1, i)); // 当前第i位数字为0 单位数字不可译码 if(sDigit == 0){ // 超出字母范围 双位数字不可译码 if(dDigit==0 || dDigit>26){ return 0; }else{ // 双位数字译码 dp[i] = dp[i-2]; } }else{ // 单位数字译码 dp[i] = dp[i-1]; // 未超字母范围 双位数字可译码 (注意 01 02 03 04 05 06 07 08 09 不可译码) if(10 <= dDigit && dDigit <= 26){ // 双位数字译码 dp[i] += dp[i-2]; } } } return dp[len]; } }