题目描述
一条包含字母 A-Z 的消息通过以下方式进行了编码:
‘A’ -> 1
‘B’ -> 2
…
‘Z’ -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
题解
想到了动态规划,却没有想到状态转移方程会是f(n) = f(n-1) + f(n-2)。边界条件比较麻烦,f(n-1)表示s[index-1], s[index]分开解码,f(n-2)表示合并解码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| int numDecodings(string s) { int len = s.length(); if (s[0] == '0')return 0; int f1 = 1, f2 = 0, f3 = 1; if (len == 1)return 1; int pre = s[0] - '0'; if (s[1] != '0') { if (s[0] == '1') { f2 = 2; f3 = 2; } else if (s[0] == '2') { if (s[1] < '7') { f2 = 2; f3 = 2; } else f2 = 1; } else f2 = 1; } else { if (s[0] == '1' || s[0] == '2') { f2 = 1; f3 = 1; } else return 0; } int index = 2; while (index < len) { if (s[index] == '0') { if (s[index - 1] == '1' || s[index - 1] == '2') f3 = f1; else return 0; } else if (s[index - 1] == '1') { f3 = f2 + f1; } else if (s[index - 1] == '2') { if (s[index] < '7') f3 = f1 + f2; else f3 = f2; } else f3 = f2;
f1 = f2; f2 = f3; index++; } return f3; }
|