要求:0-a,25-z,多种可能
思路:动态规划
12有1 2,12
122有1 2 2,12 2,1 22
1222有1 2 2 2,12 2 2,1 22 2,1 2 22,12 22
很明显,补单个不增加,结合前一位才增加,增加的个数等于前一位尚未结合的个数,用single和dp两个数组,single更新规则是等于前一个的dp
实际上就是dp[i]=dp[i-1]+dp[i-2](可以的话)
还可以把空间简化(本题dp从右向左也一样,所以直接对num取余)
class Solution {
public:
int translateNum(int num) {
string nums=to_string(num);
int n=nums.size();
vector<int> single(n);
vector<int> dp(n);
single[0]=1;
dp[0]=1;
for(int i=1;i<n;++i){
if(nums[i-1]=='1'||(nums[i-1]=='2'&&nums[i]>='0'&&nums[i]<='5'))
dp[i]=dp[i-1]+single[i-1];
else dp[i]=dp[i-1];
single[i]=dp[i-1];
}
return dp[n-1];
}
};