lzzhang07的专栏

首先注意到此题具有递归解,处理到第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;

打破原先的记录,生活没有预赛,要想登上它的领奖台,

lzzhang07的专栏

相关文章:

你感兴趣的文章:

标签云: