超时递归
class Solution {
private:
int cnt = 0;
public:
int numDecodings(string s) {
dfs(0,s);
return cnt;
}
bool isOk(string t)
{
if(t.size() == 1)
{
return t!="0";
}
if(t.size() == 2)
{
if(t[0] == '1') return true;
if(t[0] == '2') return t[1]>='0' && t[1]<='6';
}
return false;
}
void dfs(int start,string s)
{
if(start == s.size())
{
cnt ++;
return ;
}
else
{
for(int i = 1;i<=2;i++)
{
if(start+i<=s.size())
{
string t = s.substr(start,i);
if(isOk(t))
{
dfs(start+i,s);
}
}
}
}
}
};
2.DP
class Solution {
private:
int cnt = 0;
public:
int numDecodings(string s) {
vector<int>dp(s.size(),0);
if(s[0]!='0') dp[0] = 1;
for(int i = 1;i<s.size();i++)
{
if(i-1>=0)
{
if(s[i] != '0')
{
dp[i]+=dp[i-1];
}
}
if(i-2>=-1)
{
if(s[i-1]=='1') dp[i] += i-2 == -1 ? 1 : dp[i-2];
else if(s[i-1]=='2' && s[i]>='0' && s[i]<='6') dp[i] += i-2 == -1 ? 1 : dp[i-2];
}
}
return dp[s.size()-1];
}
};