题解 | #把数字翻译成字符串#
把数字翻译成字符串
https://www.nowcoder.com/practice/046a55e6cd274cffb88fc32dba695668
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
public int solve (String nums) {
//为空或者开头为0直接错误
if (nums == null || nums.charAt(0) == '0') {
return 0;
}
//如果存在多个0相连,或者30 40 这种也是错误的
for (int i = 1; i < nums.length(); i++) {
if (nums.charAt(i) == '0') {
if (nums.charAt(i - 1) > '2' || nums.charAt(i - 1) == '0') {
return 0;
}
}
}
// dp[]记录下标为止有多少种翻译方法
int[] dp = new int[nums.length()];
//计算dp[0]
dp[0] = 1;
//如果存在计算dp[1] 只有当第二位在11-19 21-26之间才是两种,其余的都是一种
if (nums.length() > 1) {
if ((nums.charAt(0) == '1' && nums.charAt(1) <= '9' && nums.charAt(1) != '0') ||
(nums.charAt(0) == '2' && nums.charAt(1) <= '6' && nums.charAt(1) != '0')) {
dp[1] = 2;
} else {
dp[1] = 1;
}
}
//依次遍历后面的数
for (int i = 2; i < nums.length(); i++) {
if ((nums.charAt(i - 1) == '1' && nums.charAt(i) <= '9' ) ||
(nums.charAt(i - 1) == '2' && nums.charAt(i) <= '6')) {
if (nums.charAt(i) != '0') {
//在11-19 21-26之间才是两种
dp[i] = dp[i - 1] + dp[i - 2];
} else {
//10 20 的情况给
dp[i] = dp[i - 2];
}
} else {
//其余情况,不能和前一个数字搭配破译
dp[i] = dp[i - 1];
}
}
return dp[nums.length() - 1];
}
}
