思路:
dp[i]表示字符串索引0到索引i的子串的映射数
接下来就是考虑dp[i]和dp[i-1]的关系
首先考虑st[i]是不是’0’
如果是,再看st[i-1]和st[i]组成的数字是不是在1到26之间
****如果在,则dp[i]=dp[i-2] (要判定边界)
****如果不在,则dp[i]=0
如果不是,则还要再判断st[i-1]是不是’0’
接下来的判断直接看代码
public static int numDecodings(String s) {
char[] st=s.toCharArray();
int length=st.length;
int[] dp=new int[length];
if(st[0]=='0'){
return 0;
}else{
dp[0]=1;
}
int temp;
String str;
for(int i=1;i<length;i++){
str=new String(new char[]{st[i-1],st[i]});//char类型直接用会自动转成int
temp=Integer.parseInt(str);
if(st[i]=='0'){//这是简单的情况
if(temp>=10&&temp<=26){
if(i>=2){
dp[i]=dp[i-2];
}else{
dp[i]=dp[i-1];
}
}else{
dp[i]=0;
}
}else{//这是复杂的情况
if(st[i-1]!='0'){
if(temp>=10&&temp<=26){
if(i>=2){
dp[i]=dp[i-2]+dp[i-1];
}else{
dp[i]=2;
}
}else{
dp[i]=dp[i-1];
}
}else{
dp[i]=dp[i-1];
}
}
}
return dp[length-1];
}