CMB24. 解码方法
描述
一条包含字母 A-Z 的消息通过以下方式进行了编码:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
输入描述
12可以解码成“AB”,“L”这两种输出描述
解码方法的总数示例1
输入:
12
输出:
2
说明:
12可以解码成“AB”,“A,B"这两种C 解法, 执行用时: 2ms, 内存消耗: 256KB, 提交时间: 2019-09-21
#include<stdio.h> #include<string.h> int cnum(char a,char b) { int num; num = (a-'0')*10 + b-'0'; return num; } int func(char* a,int len,int i) { int num=1; int flag=0; if((len-i)>=2) { int nu=cnum(a[i],a[i+1]); if(nu<=26) flag=1; } else if(i==len-1) return 1; else if(i==len) return 1; if(flag==0) return num=num*1*func(a,len,i+1); else if(flag==1) return num=num*1*func(a,len,i+2)+num*1*func(a,len,i+1); } int main() { char a[10000]; scanf("%s",&a); int num=1; if(strlen(a)==1) { printf("1\n"); return 0; } int len = strlen(a); num=func(a,len,0); printf("%d\n",num); }
C 解法, 执行用时: 2ms, 内存消耗: 308KB, 提交时间: 2021-09-23
#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; }