版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014491519/article/details/78488330
题目
‘A’ -> 1
‘B’ -> 2
‘Z’ -> 26
Given encoded message “12”, it could be decoded as “AB” (1 2) >or “L” (12).
The number of ways decoding “12” is 2.
思路:动态规划
dp[i]表示前i个数字的解码方式个数
第一次的思路
public int numDecodings(String s) {
if(s.length() == 0)
return 0;
if(s.charAt(0) == '0')
return 0;
int[] dp = new int[s.length()];
dp[0] = 1;
for(int i = 1; i < s.length();i++){
if(s.charAt(i) == '0'){
if(s.charAt(i-1) == '1' || s.charAt(i-1) == '2')
dp[i] = dp[i-1];
else
return 0;
}else if(s.charAt(i) == '1' || s.charAt(i) == '2'){
if(i < s.length()-1){
if(s.charAt(i+1) == '0')
dp[i] = dp[i-1];
else{
if(s.charAt(i-1) == '1' || s.charAt(i-1) == '2')
dp[i] = dp[i-1] + 1;
else
dp[i] = dp[i-1];
}
}else{
if(s.charAt(i-1) == '1' || s.charAt(i-1) == '2')
dp[i] = dp[i-1] + 1;
else
dp[i] = dp[i-1];
}
}else if(s.charAt(i) <= '6'){
if(s.charAt(i-1) == '1' || s.charAt(i-1) == '2')
dp[i] = dp[i-1] + 1;
else
dp[i] = dp[i-1];
}else{
if(s.charAt(i-1) == '1')
dp[i] = dp[i-1] + 1;
else
dp[i] = dp[i-1];
}
}
return dp[s.length()-1];
}
上述代码有错误,计算的方式不对
正确的代码:
public int numDecodings(String s) {
if(s.length() == 0)
return 0;
if(s.charAt(0) == '0')
return 0;
int[] dp = new int[s.length()];
dp[0] = 1;
for(int i = 1; i < s.length();i++){
if(s.charAt(i) == '0'){
if(s.charAt(i-1) == '0' || s.charAt(i-1) >= '3')
return 0;
else
dp[i] = (i>1)?dp[i-2]:1;
}else{
if(s.charAt(i-1) == '0' || s.charAt(i-1) > '2') dp[i] = dp[i-1];
else if(s.charAt(i-1) == '2' && s.charAt(i) > '6') dp[i] = dp[i-1];
else {
dp[i] = (i>1)?dp[i-2]:0;
dp[i] += (i>1)?dp[i-1]:(dp[i-1]+1);
}
}
}
return dp[s.length()-1];
}
思路:待补……