题解 | #把数字翻译成字符串#

把数字翻译成字符串

http://www.nowcoder.com/practice/046a55e6cd274cffb88fc32dba695668

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];
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务