classSolution{public:intnumDecodings(strings){constintn=s.length();// dp[i] := # of ways to decode s[i..n)vector<int>dp(n+1);dp[n]=1;// ""dp[n-1]=isValid(s[n-1]);for(inti=n-2;i>=0;--i){if(isValid(s[i]))dp[i]+=dp[i+1];if(isValid(s[i],s[i+1]))dp[i]+=dp[i+2];}returndp[0];}private:boolisValid(charc){returnc!='0';}boolisValid(charc1,charc2){returnc1=='1'||c1=='2'&&c2<'7';}};
classSolution{publicintnumDecodings(Strings){finalintn=s.length();// dp[i] := # of ways to decode s[i..n)int[]dp=newint[n+1];dp[n]=1;// ""dp[n-1]=isValid(s.charAt(n-1))?1:0;for(inti=n-2;i>=0;--i){if(isValid(s.charAt(i)))dp[i]+=dp[i+1];if(isValid(s.charAt(i),s.charAt(i+1)))dp[i]+=dp[i+2];}returndp[0];}privatebooleanisValid(charc){returnc!='0';}privatebooleanisValid(charc1,charc2){returnc1=='1'||c1=='2'&&c2<'7';}}
classSolution:defnumDecodings(self,s:str)->int:n=len(s)# dp[i] := # Of ways to decode s[i..n)dp=[0]*n+[1]defisValid(a:chr,b=None)->bool:ifb:returna=='1'ora=='2'andb<'7'returna!='0'ifisValid(s[-1]):dp[n-1]=1foriinreversed(range(n-1)):ifisValid(s[i]):dp[i]+=dp[i+1]ifisValid(s[i],s[i+1]):dp[i]+=dp[i+2]returndp[0]