int numDecodings(string s) { // Start typing your C/C++ solution below // DO NOT write int main() function if( s.length() < 1) return 0; if(caches.find(s) != caches.end()) { return caches[s]; } if(s[0] == '0') return caches[s]= 0; if(s.length() > 1) { if( s[0] == '1' || ( s[0] == '2' && s[1] < '7')) { int sum1 = numDecodings(s.substr(1)); int sum2 = 1; if( s.length() > 2) { sum2 = numDecodings(s.substr(2)); } return sum1 + sum2; } else { return caches[s] = numDecodings(s.substr(1)); } } return caches[s] = 1; }
int main() { char s[] = "201"; int ans = numDecodings(s); printf("%d\n", ans); system("pause"); return 0; }
int main(void){ char s[20]; while(gets(s)){ int result=numDecodings(s); printf("%d\n",result); } }
int numDecodings(string& s, int i) { if(i == s.length()) return 1; if(memory[i] != -1) return memory[i]; if(s[i] == '0') return 0; if((s[i] == '1' && i+1 < s.length() && s[i+1] != '0') || (s[i] == '2' && i+1 < s.length() && s[i+1] >= '1' && s[i+1] <= '6')) { if(i+2 < s.length() && s[i+2] == '0') { int res = numDecodings(s, i+1); memory[i] = res; return res; } int res1, res2; res1 = numDecodings(s, i+1); if(res1) res2 = numDecodings(s, i+2); else res2 = 0; memory[i] = res1+res2; return memory[i]; } if((s[i] == '1' && i+1 < s.length() && s[i+1] == '0') || (s[i] == '2' && i+1 < s.length() && s[i+1] == '0')) { int res = numDecodings(s, i+2); memory[i] = res; return res; } int res = numDecodings(s, i+1); memory[i] = res; return res; }
int numDecodings(string s) { if(s.length() == 0) return 0; memory = new int[s.length()]; for(int i = 0; i < s.length(); i++) memory[i] = -1; return numDecodings(s, 0); }
int numDecodings(char* s) { if(s==NULL) return 0; int len=strlen(s); if(len==0) return 0; for(int i=0;i<len;i++){//先检查是否有非法字符 if(!(s[i]>='0'&&s[i]<='9')){ return 0; } } if(len==1){ if(s[0]=='0') return 0; else return 1; } int result=0; //下面为大于等于2的情况。 if(s[0]=='1'||(s[0]=='2'&&s[1]<='6')){ result= numDecodings(s+1)+numDecodings(s+2); } else{ result= numDecodings(s+1); } return result+1; }