dfs方法,超时
class Solution {
public:
int res = 0;
int numDecodings(string s) {
dfs(s,0);
return res;
}
void dfs(string s, int index){
if(index==s.size()){
res++;
return;
}
if(s[index]!='0') dfs(s,index+1);
if(s[index]!='0'&&index<s.size()-1){
string tmp = s.substr(index,2);
int a=atoi(tmp.c_str());
if(a<=26) dfs(s,index+2);
}
}
};
// 动态规化
dp[i] 表示s的前i个字母的解码方案数,转移方程dp[i] = (dp[i-1] if s[i]!='0') + (dp[i-2], if s[i], s[i-1] 构成两位有效数字)
注意边界情况。
class Solution {
public:
int numDecodings(string s) {
int n = s.size();
s = " " + s;
vector<int> dp(n+1,0);
dp[0] = 1;
for(int i=1;i<=n;i++){
if(i>=2){
string tmp = s.substr(i-1,2);
int a = atoi(tmp.c_str());
if(a<=26&&a>9) dp[i]+=dp[i-2];
}
if(s[i]!='0') dp[i]+=dp[i-1];
}
return dp[n];
}
};