原题
题解
方法一 dp
我们在考虑字符串s从头到尾能代表多少种字母解码方式的时候,实际上是根据前多少位有多少种解码方式来计算的。
建立一个动态规划的数组ans,下标为i的那个表示的是,从头到s中的下表为i的那位一共能组成多少种解码。首先开头不能是0,这样的话不管一位一码还是两位一码都匹配不到字母,这时需要直接返回0;另外s长度为0也需要返回0;在考虑其他情况下的ans[i]的时候,需要先看一下i-1位置,两位置能不能组成10到26的数字
本方法java代码示例:
/*
@v7fgg
执行用时:3 ms, 在所有 Java 提交中击败了30.48%的用户
内存消耗:38.3 MB, 在所有 Java 提交中击败了7.69%的用户
2020年7月29日 11:05
*/
class Solution {
public int numDecodings(String s) {
if(s.length()==0||s.charAt(0)=='0'){return 0;}
int[] ans=new int[s.length()];
ans[0]=1;
for(int i=1;i<s.length();i++){
if(s.charAt(i)=='0'){
if(s.charAt(i-1)>'2'||s.charAt(i-1)=='0'){return 0;}
ans[i]=i==1?1:ans[i-2];
continue;
}
int a=Integer.parseInt(s.substring(i-1,i+1));
if(a>=10&&a<=26){
ans[i]=i==1?2:ans[i-2]+ans[i-1];
}
else{
ans[i]=ans[i-1];
}
}
return ans[s.length()-1];
}
}
//注意示例:0,10,30