https://oj.leetcode.com/problems/decode-ways/
对于1 3 2 4 3 1 可以一次选择一个数,或者一次选择两个数进行拆分
使用递推来做,但是有几个情况关于0的,要考虑清楚了。
1. A[0] == '0' return 0
2. A[1] = 1
3. A[1] == '0' && A[01]<27 A[1] = 1
4. A[1] == '0' && A[01]>27 A[1] = 0
5. A[1] != 0 && A[01]<27 A[1] = 2
6. A[1] != 0 && A[01]>27 A[1] = 1
7. A[n] = A[n-1]+A[n-2]
A[n-1 n] == '0''0'
return 0
当第n位可以自己组成一组的时候,可以加上A[n-1] 即 s[n] != '0'
当第n-1位和第n位可以组成一组的时候,可以加上 A[n-2] 即 s[n-1] != '0' 且 A[n-1 n] <27
#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; class Solution { public: int numDecodings(string s) { if(s.size()==0) return 0; vector<int> ans; ans.resize(s.size()); if(s[0] == '0' ) return 0; else ans[0] = 1; if(s.size()>=2) { if(s[1] == '0') if(s[0] <= '2') ans[1] = 1; else return 0; else { if((s[0]-'0')*10 + s[1] - '0' <=26) ans[1] = 2; else ans[1] = 1; } for(int i = 2;i<s.size();i++) { if(s[i] == '0' && s[i-1] == '0') return 0; if(s[i] == '0' && ((s[i-1]-'0')*10 + s[i] - '0' <=26)) ans[i] = ans[i-2]; else if(s[i] == '0' && ((s[i-1]-'0')*10 + s[i] - '0'>26)) return 0; else if(s[i-1] == '0') ans[i] = ans[i-1]; else if(((s[i-1]-'0')*10 + s[i] - '0' <=26)) ans[i] = ans[i-2] + ans[i-1]; else ans[i] = ans[i-1]; } } return ans[s.size()-1]; } }; int main() { class Solution mys; string in; in.push_back('3'); in.push_back('0'); in.push_back('1'); //in.push_back('4'); cout<<mys.numDecodings(in); }