解题思路:
刚开始用的回溯,后来发现正解用DP,感觉好多关于字符串的题都是用DP来做的
提交代码:回溯
class Solution {
public int numDecodings(String s) {
if(s.length()==0||s.charAt(0)=='0') return 0;
for(int i=0;i<s.length()-1;i++) {
if(s.charAt(i)=='0'&&
s.charAt(i+1)=='0')
return 0;
}
return decodingWays(0,s);
}
public int decodingWays(int p,String s) {
if(p>=s.length()) return 1;
int cnt1=0,cnt2=0;
if(s.charAt(p)=='0') return 0;
if((s.charAt(p)=='1'||s.charAt(p)=='2')&&
p<s.length()-1&&s.charAt(p+1)=='0')
return decodingWays(p+2,s);
boolean flag1=(s.charAt(p)=='1'&&p<s.length()-1);
boolean flag2=(s.charAt(p)=='2'&&p<s.length()-1&&
s.charAt(p+1)<'7');
if(flag1||flag2){
cnt1+=decodingWays(p+1,s);
cnt2+=decodingWays(p+2,s);
}else {
cnt1+=decodingWays(p+1,s);
}
return cnt1+cnt2;
}
}
运行结果:
提交代码:DP
class Solution {
public int numDecodings(String s) {
if(s.length()==0||s.charAt(0)=='0') return 0;
int[] dp=new int[s.length()];
dp[0]=1;boolean flag1,flag2;
for(int i=1;i<s.length();i++) {
if(s.charAt(i)=='0') {
if(s.charAt(i-1)=='1'||s.charAt(i-1)=='2') {
if(i>1) {
dp[i]=dp[i-2];
}else dp[i]=1;
} else return 0;
}else {
flag1=s.charAt(i-1)=='1';
flag2=s.charAt(i-1)=='2'&&s.charAt(i)<'7';
if(flag1||flag2) {
if(i==1) dp[i]=2;
else dp[i]=dp[i-1]+dp[i-2];
continue;
}else {
dp[i]=dp[i-1];
}
}
}
return dp[s.length()-1];
}
}
运行结果: