题目:
A message containing letters from A-Z
is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12"
, it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding "12"
is 2.
思路:动态规划
代码:(从左向右dp)
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' ? 1 : 0;
for(int i = 2; i <= n; i++) {
int first = Integer.valueOf(s.substring(i-1, i));
int second = Integer.valueOf(s.substring(i-2, i));
if(first >= 1 && first <= 9) {
dp[i] += dp[i-1];
}
if(second >= 10 && second <= 26) {
dp[i] += dp[i-2];
}
}
return dp[n];
}
}
代码:(从右向左dp)
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];
}
}
自己的代码:(很挫。。。。)
public int numDecodings(String s) {
if(s.length()==0||s.equals("0"))
return 0;
if(s.length()==1)
return 1;
int [] re = new int[s.length()];
re[0]=1;
if(s.length()>=2){
String ss = s.substring(0,2);
int ii = Integer.parseInt(ss);
if(ii<10)
return 0;
else if(ii==10||ii==20)
re[1]=1;
else if(ii%10==0)
return 0;
else if(ii<26)
re[1]=2;
else
re[1]=1;
// if(s.charAt(0)=='0') //s:*0
// return 0;
// else if(s.charAt(0)<='2'&&s.charAt(1)=='0'){ //s:10 20
// re[1]=1;
// }else if(s.charAt(0)>='3'&&s.charAt(1)=='0') //30 40..
// return 0;
// else if(Integer.parseInt(s.substring(0,2))<=26){ //s<=26
// re[1]=2;
// }else{ //s>26
// re[1]=1;
// }
}
for(int i=2;i<s.length();i++){
if(s.charAt(i)=='0'&&(s.charAt(i-1)>='3'||s.charAt(i-1)=='0')){ //出现了30 40 ... 00
return 0;
}else if(s.charAt(i)=='0') //10 20
re[i]=re[i-2];
else if(Integer.parseInt(s.substring(i-1,i+1))>=11&&Integer.parseInt(s.substring(i-1,i+1))<=26) //不是01~09 并且1<=s<=26
re[i]=re[i-1]+re[i-2];
else //s>26
re[i]=re[i-1];
}
return re[s.length()-1];
}