2022.0816算法第32题把数字翻译成字符串
这题也是采用动态规划进行求解,但是状态转移方程就不是特别好想了。
1、状态矩阵
dp表示字符串i个位置可能的翻译方法。
vector<int> dp(nums.size()+1,1);
2、初始状态
初始状态需要考虑的比较多,
dp[0]=1,dp[1]=1;
if(nums=="0")
    return 0;
if(nums=="10"||nums=="20")
    return 1;
for(int i=1;i<nums.size();i++){
    if(nums[i]=='0'&&nums[i-1]!='1'&&nums[i-1]!='2')
        return 0;
}
3、状态转移方程
这个状态转移方程也是比较复杂,情况比较多,需要考虑的很细,要确保数字在11-19和21-26之间,包括两边.
if((nums[i-2]=='1'&&nums[i-1]!='0')||
   (nums[i-2]=='2'&&nums[i-1]>'0'&&nums[i-1]<'7')){
    dp[i]=dp[i-1]+dp[i-2];
}
else{
    dp[i]=dp[i-1];
}
我刚开始没想到需要和前两项构成关系,只考虑前一项是不行的。
第i项的值,在满足数字在11-19和21-26之间时,为
dp[i-1]+dp[i-2]
主要就是这时候需要考虑两种情况。
但不满足11-19和21-26之间时,
dp[i]=dp[i-1];
情况就不会变多。
觉着挺难的。