题目描述:
一条包含字母 A-Z
的消息通过以下方式进行了编码:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12" 输出: 2 解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入: "226" 输出: 3 解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
思路:对于第i个字符,只要s[i]!='0'(1-9有编码),解码方法并不会增加,和s[i-1]的解码方法个数一样,
然后看s[i-1]是否是'1'、'2'(1或者2可以和下一位组成新编码),因s[i+1]和s[i]组成了新的编码,
所以此时s[i]的编码总数需要再加上s[i-2]的编码个数。
注意:除了第一位不能为'0',之后的都可以,'10'也属于编码。
class Solution { public: int numDecodings(string s) { if(s.size() == 0 || s[0] == '0') return 0; vector<int> a(s.size()); int i; a[0]=1; for(i =1;i<s.size();i++) { if(s[i] != '0') { a[i] = a[i-1]; } if(s[i-1]=='1' || s[i-1]=='2' && s[i]>='0' && s[i]<='6') { if(i==1) { a[i] = a[i]+a[i-1]; }else { a[i] = a[i]+a[i-2]; } } } return a[i-1]; } };