一条仅包含字母‘A’-‘Z’的消息用下列的方式加密成数字
'A' -> 1 'B' -> 2 ... 'Z' -> 26现在给出加密成数字的密文,请判断有多少种解密的方法
例如:
给出的密文为“13”,可以解密为"AC"(1 3) 或者"M"(13).
所以密文"13"的解密方法是2种.
import java.util.*;
public class Solution {
/**
*
* @param s string字符串
* @return int整型
*/
public int numDecodings (String s) {
char[] charArray = s.toCharArray();
int length = charArray.length;
if (length <= 0 ||charArray[0] == '0') {
return 0;
}
int[] dp = new int[length];
dp[0] = 1;
for (int i = 1; i < length; i++) {
if (charArray[i] != '0') {
dp[i] = dp[i - 1];
}
int num = 10 * (charArray[i - 1] - '0') + (charArray[i] - '0');
if (num >= 10 && num <= 26){
if (i == 1) {
dp[i] ++;
}
else {
dp[i] += dp[i - 2];
}
}
}
return dp[length - 1];
}
} public class Solution {
public int numDecodings(String s) {
if(s.length()==0||s.charAt(0)=='0'){
return 0;
}
int dp[] = new int[s.length() +1];
dp[0]=1;
dp[1]=1;
for(int i=2;i<=s.length();i++){
if(s.charAt(i-1)!='0'){
dp[i] += dp[i-1];
}
if(Integer.valueOf(s.substring(i-2,i))>=10
&& Integer.valueOf(s.substring(i-2,i))<=26){
dp[i] +=dp[i-2];
}
}
return dp[s.length()];
}
} | s | 1 | 12 | 120 | 1207 | 12072 | 120723 |
| dp[0] | 1 | 1 | 0 | 1 | 1 | 1 |
| dp[1] | 0 | 1 | 1 | 0 | 0 | 1 |
public class Solution {
public int numDecodings(String s) {
if(s.length() == 0 || s.charAt(0) == '0'){
return 0;
}
int[][] dp = new int[2][s.length()];
dp[0][0] = 1;
dp[1][0] = 0;
for(int i = 1; i < s.length();i++){
if((int)s.charAt(i) == '0'){
dp[0][i] = 0;
}else{
dp[0][i] = dp[0][i-1] + dp[1][i-1];
}
if((s.charAt(i-1)-'1'+1)*10+(s.charAt(i)-'1'+1) <=26){
dp[1][i] = dp[0][i-1];
}else{
dp[1][i] = 0;
}
}
return dp[0][s.length()-1]+dp[1][s.length()-1];
}
}
public static int numDecodings(String s) {
int n=s.length();
int[] dp=new int[n+1];
dp[n]=1;
dp[n-1]=(s.charAt(n-1)=='0')?0:1;
for(int i=n-2;i>=0;i--){
if(s.charAt(i)=='0')continue;
if(Integer.valueOf(s.substring(i,i+2))<=26){
dp[i]=dp[i+1]+dp[i+2];
}else{
dp[i]=dp[i+1];
}
}
return dp[0];
}
zhuyi'0' c1=c2;c2=count;
public class Solution {
public int numDecodings(String s) {
if (s == null || s.length() == 0)
return 0;
int n = s.length();
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = s.charAt(0) == '0' ? 0 : 1;
for (int i = 2; i <= s.length(); ++i) {
int oneBit = Integer.parseInt(s.substring(i - 1, i));
int twoBit = Integer.parseInt(s.substring(i - 2, i));
if (oneBit >= 1 && oneBit <= 9) {
dp[i] += dp[i - 1];
}
if (twoBit >= 10 && twoBit <= 26) {
dp[i] += dp[i - 2];
}
}
return dp[n];
}
} public class Solution {
public int numDecodings(String s) {
if(s.length()==0) return 0;
int [] dp = new int[s.length()+1];
dp[0]=1;
if(s.length()>0&&s.charAt(0)>'0')
dp[1]=1;
for(int i=2;i<=s.length();i++){
if(s.charAt(i-1)>'0')
dp[i]=dp[i-1];
if(s.charAt(i-2)>'0'){
int t =Integer.parseInt(s.substring(i-2,i));
if(t<=26&&t>0)
dp[i]+=dp[i-2];
}
}
return dp[s.length()];
}
} public class Solution {
public int numDecodings(String s) {
if(s.length() < 1 || s.charAt(0) == '0')
return 0;
int[] dp = new int[s.length()+1];
dp[0] = 1;
dp[1] = 1;
for(int i=2; i<=s.length(); i++) {
if(s.charAt(i-1) != '0')
dp[i] += dp[i-1];
if(s.charAt(i-2) == '1' || (s.charAt(i-2) == '2' && s.charAt(i-1) <= '6' && s.charAt(i-1) >= '0'))
dp[i] += dp[i-2];
}
return dp[s.length()];
}
}
public class Solution { public int numDecodings(String s) { int n = s.length(); if (n == 0) return 0; int[] memo = new int[n+1]; memo[n] = 1; memo[n-1] = s.charAt(n-1) != '0' ? 1 : 0; for (int i = n - 2; i >= 0; i--) if (s.charAt(i) == '0') continue; else memo[i] = (Integer.parseInt(s.substring(i,i+2))<=26) ? memo[i+1]+memo[i+2] : memo[i+1]; return memo[0]; } }