zoukankan      html  css  js  c++  java
  • leetcode——91.解码方法

    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

    我的前方是万里征途,星辰大海!!
  • 相关阅读:
    Centos7安装Docker
    [LeetCode] 651. 四键键盘 ☆☆☆(动态规划)
    一行代码就能解决的算法题
    博弈问题--石头游戏(动态规划)
    [LeetCode] 322. 零钱兑换 ☆☆☆(动态规划)
    java趣题
    [LeetCode] 516. 最长回文子序列 ☆☆☆(动态规划)
    [LeetCode] 337. 打家劫舍III ☆☆☆(动态规划)
    算法基础--贪心算法
    [LeetCode] 42. 接雨水 ☆☆☆☆☆(按列、动态规划、双指针)
  • 原文地址:https://www.cnblogs.com/taoyuxin/p/11676790.html
Copyright © 2011-2022 走看看