class Solution: def numDecodings(self, s: str) -> int: a={} if int(s[0])==0: return 0 else: a[0]=1 if len(s)==1: return a[0] if int(s[0])>2 and int(s[1])==0: a[1]=0 if len(s)>1: return 0 if (int(s[0]+s[1])>26) or (int(s[0])<3 and int(s[1])==0): a[1]=1 elif int(s[0]+s[1])<=26: a[1]=2 #print(a) if len(s)==2: return a[1] for i in range(2,len(s)): if s[i-1]=='0' and s[i]=='0': return 0 elif int(s[i-1])>2 and s[i]=='0': return 0 elif (int(s[i-1]+s[i]))>26 or (s[i-1]=='0' and int(s[i])!=0): a[i]=a[i-1] elif int(s[i-1])<3 and s[i]=='0': a[i]=a[i-2] elif int(s[i-1]+s[i])<=26: a[i]=a[i-1]+a[i-2] else: a[i]=a[i-1] return a[len(s)-1]
执行用时 :44 ms, 在所有 python3 提交中击败了88.37%的用户
内存消耗 :14 MB, 在所有 python3 提交中击败了5.21%的用户
思路分析:
当字符串的首位为0的时候,直接输出0;
先分析给定前两位的种类个数,统一分析长度大于2的情况;
如果中间位出现30,40,50等等的这种情况以及00的这种情况,直接输出0;
如果像31,58这种大于26的数,输出结果与前一位的结果相同,即a[i]=a[i-1];
如果是10,20这样的情况,a[i]=a[i-2]
如果是23,18等这种小于27的情况,a[i]=a[i-1]+a[i-2]
结束。
——2019.10.15
用java又做了一遍。
public int numDecodings(String s) { if(s.charAt(0) == '0'){ return 0; } int n = s.length(); if(n==0){ return 0; } int[] dp = new int[n+1]; dp[0] = 1; dp[1] = 1; for(int i = 1;i<n;i++){ if(s.charAt(i)=='0' && s.charAt(i-1) == '0'){ return 0; } //dp[i] = dp[i-1] + dp[i-2] 如果 int k = Integer.parseInt(s.substring(i - 1,i+1)); if(k ==10 || k == 20){ dp[i+1] = dp[i-1]; }else if( k >10 && k <=26){ dp[i+1] = dp[i] + dp[i-1]; }else if(k%10 == 0){ return 0; } else{ dp[i+1] = dp[i]; } } return dp[n]; }
——2020.6.27