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.
思路:
一维动态规划(不用一维数组保存前面信息,只用三个数迭代n1=res[i-2],n2=res[i-1],n3=res[i]),只考虑2个数字s[i-1]s[i],有以下可能:00,01...09,10...19,20...26, 27...30, ...
1. s[i]=='0': 00, 10,20,30,...
a). s[i-1]=='1'/'2' res[i]=res[i-2]; 只能是s[i-1]s[i]一起decode
b). others return 0; 不可能decode
2. s[i]!='0': 01...09,11...19,21...26, 27...
a). s[i-1]=='1' || (s[i-1]=='2'&&s[i]<'7') (11...19,21...26) res[i]=res[i-1]+res[i-2]; 即能自己也可以和s[i-1]一起decode
b). others :s[i-1]=='0' (01...09)|| s[i-1]s[i]>26 res[i]=res[i-1]; 只能自己decode
public class Solution {
public int numDecodings(String s) {
if(s==null||s.length()==0) return 0;
//len(s)>0
int n1=1, n2=s.charAt(0)=='0'?0:1; int n3=n2;
for(int i=1; i<s.length(); i++){
if(s.charAt(i)=='0'){
if(s.charAt(i-1)=='1' || s.charAt(i-1)=='2'){
n3=n1;
}
else return 0;
}
else{
if(s.charAt(i-1)=='1' || (s.charAt(i-1)=='2' && s.charAt(i)-'0'<7)){
n3 = n1+n2;
}
else n3=n2;
}
n1=n2; n2=n3;
}
return n3;
}
}