首先注意到此题具有递归解,处理到第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;
打破原先的记录,生活没有预赛,要想登上它的领奖台,