class Solution { public: /** 数字范围是1到26,建立同样大小的vector, dp[i] = dp[i-1] + dp[i-2](如果可以这个和前一个能组成一个); 遇到0,自己不能成组,看前面,若前面不是1和2则不能编译; 动态规划,dp[i]表示以这个结尾有多少种可能,根据前一个字符的情况,更新当前 */ int solve(string nums) { if (nums.size() == 0) return 0; if (nums.size() == 1) { if (nums[0] == '0')return 0; else return 1; } vector<int> dp( nums.size() ); if (nums[1] == '0' ) { if (nums[0] != '1' && nums[0] != '2') { return 0; } else { dp[0]=1; dp[1]=1; } } else { if (nums[0] == '0')return 0; else if ( stoi(nums.substr(0, 2)) > 26 ) { dp[0] = 1; dp[1] = 1; } else { dp[1] = 2; dp[0] = 1; } } for (int i = 2; i < nums.size(); i++) { if (nums[i] == '0' ) { if (nums[i - 1] != '1' && nums[i - 1] != '2') { return 0; } else { dp[i] = dp[i - 2]; } } else { if (nums[i - 1] == '0')dp[i] = dp[i - 1]; else if ( stoi(nums.substr(i - 1, 2)) > 26 ) { dp[i] = dp[i - 1]; } else { dp[i] = dp[i - 1] + dp[i - 2]; } } } return dp.back(); } };