动态规划
- 组合排序:dp[i]=dp[i-2] 单独排序:dp[i]=dp[i-1] 组合+单独排序:dp[i]=dp[i-1]+dp[i-2]
- 对于dp初始化为1,"10","20"要求初始化为1,可以考虑特殊处理
- 注意dp[i]是和0比较,不是和"0"
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
int solve(string nums) {
// write code here
// 单独排序 dp[i]=dp[i-1]
// 除0外都可以单独
// 组合排序 dp[i]=dp[i-2]
// 组合加单独 dp[i]=dp[i-2]
// nums[i-1]:1 nums[i] 0~9
// nums[i-2]: 2 nums[i] 0~6
vector<int> dp(nums.size()+1,1);
if(nums=="0")
{
return 0;
}
if(nums=="10"||nums=="20")
{
return 1;
}
//dp[i-2]
for(int i=1;i<nums.size();i++)
{
if(dp[i]==0)
{
dp[i+1]=0;
continue;
}
if(nums[i]=='0')
{
//只能组合排序
if(nums[i-1]=='1'||nums[i-1]=='2')
{
dp[i+1]=dp[i-1];
}
else{
dp[i+1]=0;
}
}
else{
//单独/组合1~9
if(nums[i-1]=='1'||
(nums[i-1]=='2'&&nums[i]<='6'&&nums[i]>='1'))
{
// 单独+组合
dp[i+1]=dp[i]+dp[i-1];
}
else{
//单独
dp[i+1]=dp[i];
}
}
}
return dp[nums.size()];
}
};