传送门
nowcoder
leetcode
题目描述
有一种将字母编码成数字的方式:’a’->1, ‘b->2’, … , ‘z->26’。
给一串数字,返回有多少种可能的译码结果。
数据范围:字符串长度满足 0 < n < 90
要求:时间复杂度 O(n),空间复杂度 O(n)
C++ 代码 - nowcoder
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
|
class Solution { public: int solve(string nums) { if (nums.empty() || nums[0] == '0') return 0;
int n = nums.size(); vector<int> f(n + 1); f[0] = 1, f[1] = 1; for (int i = 2; i <= n; i ++) { if (nums[i - 1] == '0') { if (nums[i - 2] == '1' || nums[i - 2] == '2') f[i] = f[i - 2]; else f[i] = 0; } else if (nums[i - 2] == '1' || (nums[i - 2] == '2' && nums[i - 1] <= '6')) { f[i] = f[i - 2] + f[i - 1]; } else { f[i] = f[i - 1]; } }
return f[n]; } };
|
C++ 代码 - leetcode
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
|
class Solution { public: int crackNumber(int num) { string s = to_string(num); int n = s.size(); if (n < 1) return 0;
vector<int> f(n + 1); f[0] = 1, f[1] = 1; for (int i = 2; i <= n; i++) { if (s[i - 1] >= '0' && s[i - 1] <= '9') { f[i] += f[i - 1]; } if (s[i - 2] == '1' || s[i - 2] == '2' && s[i - 1] <= '5') { f[i] += f[i - 2]; } }
return f[n]; } };
|