class Solution {
public:
/**
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
/*
分成四种情况 当前数字nums(i-1), 之前数字nums(i-2)
1,无法独立编码也无法组合编码
nums(i-1) == 0 && (nums(i-2) == 0 || nums(i-2) > 2)
2, 只能组合编码
nums(i-1) = 0
3,只能独立编码
nums(i-2) == 0 || nums(i-2) >2
4, 其他(两种编码方式都可)
dp(i) = dp(i-1) + dp(i-2);
*/
int solve(string nums) {
if (nums == "" || nums.length() == 0) {
return 0;
}
int len = nums.size();
vector<int>dp (len + 1, 0); // 表示以i结尾的种类
dp[0] = 1;
dp[1] = (nums[0] == '0') ? 0 : 1;
for(int i = 2; i <= len; i++) {
// 无法获取值
if (nums[i-1] == '0' && (nums[i-2] == '0' || nums[i-2] > '2')) {
return 0;
} else if (nums[i-1] == '0') { // 只能组合
dp[i] = dp[i-2];
} else if (nums[i-2] == '0' || nums[i-2] > '2' || (nums[i-2] == '2' && nums[i-1] > '6')) { // 只能独立
dp[i] = dp[i-1];
} else { // 其他情况
dp[i] = dp[i-1] + dp[i-2];
}
}
return dp[len];
// write code here
}
};