Decode Ways
A message containing letters from A-Z
is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12"
, it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding "12"
is 2.
算法思想:
直接dfs超时,需要加上纪录路径
class Solution {
public:
bool isValid(string s){
if(s[0]=='0')return false;
int sum=0;
for(int i=0;i<s.size();i++){
sum*=10;
sum+=s[i]-'0';
}
return sum>=1&&sum<=26;
}
int dfs(vector<int> &dp,string &s,int start){
if(start>=s.size())return 1;
if(dp[start]!=-1)return dp[start];
if(s[start]=='0')return 0;
int sum=0;
for(int i=start;i<s.size()&&i-start<2;i++){
string sub=s.substr(start,i-start+1);
if(isValid(sub)){
sum+=dfs(dp,s,i+1);
}
}
dp[start]=sum;
return sum;
}
int numDecodings(string s) {
if(!s.size())return 0;
vector<int> dp;
dp.assign(s.size(),-1);
return dfs(dp,s,0);
}
};
动态规划:
class Solution {
public:
int numDecodings(string s) {
if(s.empty()||s[0]=='0')return 0;
int prev=0;
int cur=1;
for(size_t i=1;i<=s.size();++i){
if(s[i-1]=='0')cur=0;
if(i<2||!(s[i-2]=='1'||
(s[i-2]=='2'&&s[i-1]<='6')))prev=0;
int tmp=cur;
cur=prev+cur;
prev=tmp;
}
return cur;
}
};