首先注意到此题具有递归解,处理到第i个数字的时候,有两种情况:
1, s[i]是单独的一个字母
2, s[i]与s[i - 1]合并成一个合法的字母(在0和26之间)
在第i位的decode ways是两者之和
res[i] = s[i] != ‘0‘ ? res[i - 1] : 0 + isValid(s[i], s[i - 1]) ? res[i - 2] : 0;
由于只需要保存前两个结果,只需要const space
做得时候才发现可能会有invalid的case,所以如果上边两个条件都不满足,则直接返回0.
bool isValid(const char &a, const char &b) { if (a > '2' || (a == '2' && b > '6') || a == '0') { return false; } return true; } int numDecodings(string s) { int sz = s.size(); if (sz == 0) { return 0; } int r1 = 1; if (s[0] == '0') { r1 = 0; } int r2 = 1; for (int i = 1; i < sz; i ++) { int curr = 0; if (s[i] != '0') { curr += r1; if (isValid(s[i - 1], s[i])) { curr += r2; } } else { if (!isValid(s[i - 1], s[i])) { return 0; } else { curr = r2; } } r2 = r1; r1 = curr; } return r1;
原文地址:http://blog.csdn.net/lzzhang07/article/details/43636489