大致思路:动态规划。如果我们知道当前字符串的解密方法种数,那么添加一个字符之后解密方法种数我们就可以根据原字符串的方法种数得到:1. 添加的字符只能单个翻译 2. 添加的字符只能和前一个字符一起翻译 3. 添加的字符既可以单独翻译,又可以组合翻译 4. 出错,返回0。
根据分析容易得知,如果只能单个翻译那么添加一个字符后的字符串的种数等于之前的种数;如果只能组合翻译,那么种数等于前面第二个的种数;如果都可以,就等于前两个的和。所以我们只需要知道前面两个的值就行。
具体情况自行分析
public class Solution {
public int numDecodings (String s) {
// write code here
if(s.length()==0 || s.charAt(0)=='0') return 0;
int a = 1,b = 1;
for(int i = 1;i<s.length();i++){
if(s.charAt(i)=='0' && s.charAt(i-1)>'0' && s.charAt(i-1)<'3'){
int tmp = a;
a = b;
b = tmp;
}else if(s.charAt(i-1)=='0' && s.charAt(i) != '0' || s.charAt(i) != '0' && Integer.parseInt(s.substring(i-1,i+1))>26) {
a = b;
}else if(s.charAt(i-1)!='0' && s.charAt(i)!='0' && Integer.parseInt(s.substring(i-1,i+1))<=26){
int tmp = a+b;
a = b;
b = tmp;
}else{
return 0;
}
}
return b;
}
}