C语言 把数字翻译成字符串
1. 解题思路
动态规划问题,对于一串字符 1223424220238012,不妨设求第n个字符的可能情况。那么首先需要考虑的是这个字符nums[n],有两种大的情况,1.能否和前一个字符组成10~26之间的数,自身能否独立成一个新的数。
case1: 自身为0,只能依附于前一个字符,此时需要判断前一个字符是否等于 1或2 ,只有这样才能组成10 或者20 ,此时dp[n]=dp[n-2]
case2:自身不为0 前一个字符为0 ,此时只能自己独立成一个数字 dp[n]=dp[n-1]
case2: 自身不为0 前一个字符不为0,和前一个数字组合起来位于 10~26之间 说明既可以依附于前一个字符,又能独立存在 dp[n]=dp[n-1]+dp[n-2]
case:4 和前一个数字组合超过26 只能独立存在 dp[n]=dp[n-1]
注:这里我用的dp[i]表示 前i个字符所组成的数量
* 解码
* @param nums string字符串 数字串
* @return int整型
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
//判断传入的两个字符是否小于26
//返回值 1:小于26
//返回值 0:大于26
int between26(char a,char b){
if(a<'2')
return 1;
else if(a=='2'){
if(b<'7')
return 1;
else
return 0;
}
else
return 0;
}
int solve(char* nums ) {
if(nums==NULL)
return 0;
//数字长度
int numlen=strlen(nums);
if(numlen==1)
return 1;
//新建dp数组
int dp[100];
dp[0]=1; //0个字符
dp[1]=1; //1个字符
printf("%d",numlen);
for(int i=1;i<numlen;i++){
//首先需要考虑 nums[i]是否为0 等于0说明只能和前面凑诚一对
//此时需要判断前一个nums[i-1]是否小于2,
if(nums[i]=='0'){
if(nums[i-1]>'2'||nums[i-1]=='0')
return 0;
dp[i+1]=dp[i-1];
}
//在判断nums[n-1]是否为0 等于0说明只能自己独立存在
else if(nums[i-1]=='0')
dp[i+1]=dp[i];
//两个数字都不为0 需要判断组装起来是否超过26 小于26 说明两种可能
else{
if(between26(nums[i-1],nums[i])==1)
dp[i+1]=dp[i]+dp[i-1];
else
dp[i+1]=dp[i];
}
}
return dp[numlen];
}