列表

详情


OR92. 解码

描述

有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'。

现在给一串数字,给出有多少种可能的译码结果。



输入描述

编码后数字串

输出描述

可能的译码结果数

示例1

输入:

12

输出:

2

说明:

2种可能的译码结果(”ab” 或”l”)

示例2

输入:

31717126241541717

输出:

192

说明:

192种可能的译码结果

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 228KB, 提交时间: 2019-05-05

#include<stdio.h>
#include<string.h>
int f(int n)
{
    if(n==1)
    return 1;
    else if(n==2)
    return 2;
    else
    return f(n-1)+f(n-2);
}
int main()
{
    char s[1000];
    scanf("%s",&s);
    int num;
    num=1;
    int k=2;
    for(int i=0;i<strlen(s);i++)
    {
        if(s[i]=='0')
        {
            printf("%d\n",0);
            k=0;
              
        }
        if(s[i]=='1'&&i+1!=strlen(s)||(s[i]=='2'&&s[i+1]<='6'&&s[i+1]>='0'))
        {
            if(s[i+1]=='0')
            {
                i++;
                continue;
            }
            if(s[i+1]=='1'||(s[i+1]=='2'&&s[i+2]<='6'&&s[i+2]>'0'))
            {
                if(i+2==strlen(s))
                num=num*f(k);
                else
                k++;
            }
            else
            {
                num=num*f(k);
                i++;
                k=2;
            } 
        }
          
    }
    if(k!=0)
    printf("%d\n",num);
      
}

C 解法, 执行用时: 2ms, 内存消耗: 324KB, 提交时间: 2021-09-22

#include <stdio.h>
#include <string.h>

int main()
{
    char s[1000];
    while(scanf("%s",s)!=EOF)
    {
        if(s[0]=='0')
        {
            printf("%d\n",0);
            continue;
        }
        int len=strlen(s);
        int arr[len];
        arr[0]=1;
        if(((s[0]-48)*10+s[1]-48)>26)
            arr[1]=1;
        else
        {
            if(s[1]=='0')
                arr[1]=1;
            else
                arr[1]=2;
        }
        int i;
        for(i=2;i<len;i++)
        {
            if(s[i]=='0' && !('0'<s[i-1] && s[i]<'3'))
                break;
            if(s[i]=='0')
            {
                arr[i]=arr[i-2];
                continue;
            }
            if(s[i-1]=='0')
            {
                arr[i]=arr[i-1];
                continue;
            }
            if(((s[i-1]-48)*10+s[i]-48)>26)
                arr[i]=arr[i-1];
            else
                arr[i]=arr[i-1]+arr[i-2];
        }
        if(i==len || len==1)
            printf("%d\n",arr[len-1]);
        else
            printf("%d\n",0);
    }
    return 0;
}

上一题