整体思路:建立一个一维数组arr[len],用来记录每一个位置当前有多少种译码结果。
主要判断有0的情况:1.连续俩个零代表译码有误,输出零
2.如果第一个位置就是'0',输出零
3.当前位置为'0',前一个位置不是'1'或'0',输出零
否则,arr[0]记录为1,若果第二个位置是符合上面输出零的情况,arr[1]记录为1,否则记录为2,接下来开始循环判断,只要前一位置的值与当前的值小于26,说明就有俩种译码方式,一种是俩个字符各一个,一种是直接俩位数译码,那么当前的译码方式就有arr[i-1]+arr[i-2]。
最后,需要判断字符串中有'0'的情况:1.如果当前为零,则当前位置的译码方式就是arr[i-2],应为arr[i-1]
要与'0'组合,所以要在往前一个位置
2.如果前一位置为零,则当前位置的译码方式为arr[i-1];
#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-1]<'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; }