Q:一条仅包含字母‘A’-‘Z’的消息用下列的方式加密成数字
'A' -> 1↵'B' -> 2↵...↵'Z' -> 26
现在给出加密成数字的密文,请判断有多少种解密的方法
例如:
给出的密文为“12”,可以解密为"AB"(1 2) 或者"L"(12).
所以密文"12"的解密方法是2种.
A:分两种情况。
当前位置 s[i]>='1' && <= '9',当前位置可单独作为一个解,dp[i]+=dp[i-1];
当前和前面两个位置 s[i-1 - i] >= 10 && <= 26,两个也可为一个解,dp[i]+=dp[i-2];
public static int numDecodings(String s) {
if (s == null || s.length() == 0)
return 0;
char temp = s.charAt(0);
//第一个不能为0
if (temp == '0')
return 0;
int[] dp = new int[s.length() + 1];
//初始dp全部为0
Arrays.fill(dp, 0);
dp[0] = dp[1] = 1;
for (int i = 2; i <= s.length(); i++) {
temp = s.charAt(i - 1);
if (temp >= '1' && temp <= '9')
dp[i] += dp[i - 1];
String sub = s.substring(i - 2, i);
int sub_i = Integer.parseInt(sub);
if (sub_i <= 26 && sub_i >= 10)
dp[i] += dp[i - 2];
}
return dp[s.length()];
}