这题有点像跳箱子(一次跳一格或者两格)
如果按照跳箱子的做法,dp[n] = dp[n-2] + dp[n-1],从后往前递归,会超时(递归时间和空间都会超);
那么可以用从前往后的动态规划:
从前往后遍历,分类讨论当前元素i:
- 如果i == 0,那么前一个字符必须为1或者2,此时dp[i] = dp[i - 2],否则无法译码,直接返回0;
- 如果i != 0,考虑i-1:
-
如果i - 1 == 0,那么当前i只能单独译码,则dp[i] = dp[i - 1];
-
如果i - 1 != 0,那么看string(i - 1, i)是否在10~26之间,在的话dp[i] = dp[i - 2] + dp[i - 1], 否则dp[i] = dp[i - 1]
-
class Solution {
public:
/**
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
int solve(string nums) {
// write code here
if(!nums.size() || nums[0] == '0')
return 0;
vector<int> count;
count.push_back(1);//占位
count.push_back(1);
for(int i = 1; i < nums.size(); i ++){
if(nums[i] > '0'){
if(nums[i - 1] == '0')
count.push_back(count[i]);
else if(nums.substr(i-1,2) <= "26")
count.push_back(count[i - 1] + count[i]);
else
count.push_back(count[i]);
}
else{
if(nums[i - 1] == '1' || nums[i - 1] == '2')
count.push_back(count[i - 1]);
else
return 0;
}
}
return count.back();
}
};