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.
一题编解码的问题,和爬楼梯很像,典型的动态规划问题,用数组来存储下标 i 对应的数量,不要用递归,一般都会超时。区别在于走两步产生“二位数”x是否可以解码,这里需要判断,如果x<27并且x>=10,则可以解码,否则不可以。(避免解码“04”之类的数)
设定一个s.length()+1的数组result[] ,从而使遍历从字符串下标1 (数组下标2)开始,相应的result[0]=1,result[1]=1。
这里,重点在于’0‘的判断,如果字符串下标(i-1)为'0',则若二位可解码,则result[i]=result[i-2];若不能(如“30”、“00”等),则break,即此字符串无法解码。如果不是’0‘,则二位可解码,result[i]=result[i-1]+result[i-2];否则result[i]=result[i-1]。
代码如下:
public class Solution {
public int numDecodings(String s) {
if(s==null||s.length()==0||s.charAt(0)=='0')
return 0;
int[] result=new int[s.length()+1];
result[0]=1;
result[1]=1;
for(int i=2;i<=s.length();i++){
if(s.charAt(i-1)=='0'){
if(decodable(s,i-2,2))
result[i]=result[i-2];
else
break;
}
else {
if(decodable(s,i-2,2))
result[i]=result[i-2]+result[i-1];
else
result[i]=result[i-1];
}
}
return result[s.length()];
}
private boolean decodable(String s,int begin,int length){
String str=s.substring(begin,begin+length);
int temp=Integer.parseInt(str);
if(temp<27&&temp>=10)
return true;
else
return false;
}
}