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; }