class Solution { public: /** * 解码 * @param nums string字符串 数字串 * @return int整型 */ int solve(string nums) { // BUG1:dp[0]应为1 vector<int> dp(nums.length() + 1, 1); // BUG2:输入0 if (nums[0] == '0') { return 0; } for (int i = 2; i < nums.length() + 1; i++) { int front = nums[i - 2] - '0'; // numI==0是特例 int numI = nums[i - 1] - '0'; int num = front * 10 + numI; // BUG3\4:连续两个0,60 if (num == 0 || (numI == 0 && num > 20)) { return 0; } // BUG5:07应该判断 if (num < 27 && (num != 10) && (num != 20) && front != 0) { // 此处容易推错dp[i]是指前i位组合数 dp[i] = dp[i - 1] + dp[i - 2]; } else { dp[i] = dp[i - 1]; } } return dp[nums.length()]; } };
有够恶心的一道题,特殊情况太多,条理不清晰会出很多BUG。对于数字0的理解处理也是难点。
另外我在递推公式处就出错了。。。。。。难绷