91. Decode Ways, leetcode

来源:互联网 发布:sql复杂查询实例 编辑:程序博客网 时间:2024/05/18 16:17

题目:

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()的原因?请大神指教。

0 0
原创粉丝点击