题目:
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.
代码1,分别考虑s[i],s[j]
int numDecodings(string s) {
int n = s.size();
vector<int> dp(n, 0);
if(n == 0) return 0;
if(s[0] == '0')
dp[0] = 0;
else
dp[0] = 1;
for(int i = 1; i < n; i++)
{
if(s[i - 1] - '0' > 2)
dp[i] = s[i] == '0'? 0 : dp[i - 1];
else if(s[i - 1] - '0' == 2)
if(s[i] - '0' > 6)
dp[i] = dp[i - 1];
else if(s[i] != '0')
dp[i] = dp[i - 1] + (i - 2 >= 0 ? dp[i - 2] : 1);//注意:这里要加上括号
else
dp[i] = (i - 2 >= 0 ? dp[i - 2] : 1);
else if(s[i - 1] - '0' == 1)
if(s[i] != '0')
dp[i] = dp[i - 1] + (i - 2 >= 0 ? dp[i - 2] : 1);
else
dp[i] = (i - 2 >= 0 ? dp[i - 2] : 1);
else
if(s[i] != '0')
dp[i] = dp[i - 1];
else
dp[i] = 0;
}
return dp[n - 1];
}
代码2,将最后两位合并为一个数:
int numDecodings(string s) {
int n = s.size();
vector<int> dp( n + 1 , 0);
if(s[0] == '0' || n == 0)return 0;
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i < n + 1; i++)
{
int first = s[i - 1] - '0';
int second = stoi(s.substr(i - 2, 2));
if (1 <= first && first <= 9)
dp[i] = dp[i - 1];
if (10 <= second && second <= 26)
dp[i] += dp[i - 2];
}
return dp[n];
}
代码3,代码的降维,用pre1表示dp[i-1],pre2表示dp[i-2]即可。
总结:代码2耗时6ms,代码1耗时3ms,显然代码2比1判断更少,但是1的耗时少,substr()的原因?请大神指教。