1 class Solution 2 { 3 public: 4 int numDecodings(string s) 5 { 6 int len=s.length(); 7 if(len==0||s[0]=='0') 8 return 0; 9 if(len==1) 10 return 1; 11 int res=0,count2=1,count1=1; 12 for(int i=1;i<len;i++) 13 { 14 int cur=count1; 15 if(valids(s[i])&&validd(s[i-1],s[i])) res=count1+count2; 16 else if(valids(s[i])&&!validd(s[i-1],s[i])) res=count1; 17 else if(!valids(s[i])&&validd(s[i-1],s[i])) res=count2; 18 else return 0; 19 count2=cur; 20 count1=res; 21 res=0; 22 } 23 return count1; 24 } 25 26 bool valids(char c) 27 { 28 return c!='0'; 29 } 30 31 bool validd(char a,char b) 32 { 33 return a=='1'||(a=='2'&&b<'7'); 34 } 35 };
从头到尾扫描,和斐波那契上楼梯有点类似,问题不大