/*每次对于当前的字符判断是否属于1-9(0肯定不行,因为0不在1-26中),如果属于,那么当前的字符可以被decode,并且和f[n-1]组合,f[n] += f[n-1]
然后对于当前字符和前一个字符组成的字符串判断是否属于10-26,如果属于,那么这两个字符可以被decode,并且和f[n-2]组合,f[n] += f[n-2]
*/
题意是1-26对应于A-Z,这样一个数字字符串可以解码成只包含A-Z的字符串。例如,12可以解码成AB,也可以解码成L。这样12就有两种解码方式。实现numDecodings(string s)接受数字字符串,返回可以解码的方式数。
public int numDecodings(String s) {
if (s == null || s.length() == 0) {
return 0;
}
int[] temp = new int[s.length()];
for(int i=0;i<s.length();i++){
temp[i]=0;
}
if (check(s.charAt(0))==1)
temp[0] = 1;
else
temp[0] = 0;
if (s.length() == 1) {
return temp[0];
}
temp[1] = (check(s.charAt(0))&check(s.charAt(1)))+check(s.charAt(0),s.charAt(1));
for (int i = 2; i < s.length(); i++) {
if(check(s.charAt(i))==1)
temp[i] += temp[i-1];
if(check(s.charAt(i-1),s.charAt(i))==1)
temp[i] += temp[i-2];
}
return temp[s.length() - 1];
}
public int check(char c){
return (c!='0')?1:0;
}
public int check(char c1 , char c2){
return (c1=='1'||(c1=='2'&&c2<='6'))?1:0;
}