码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 91 解码方法

时间:2020-07-15 01:26:31      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:height   turn   current   空间   字符串   怎么   http   pre   字符   

技术图片 

  这道题怎么说呢,真的很卧槽。分分钟想把出题人打一顿,题目根本没说明白,字符串中会包含 ‘0‘ 。状态转移五分钟,边界处理两小时。

  DP 解法:

    public final int numDecodings(String s) {
        if (s == null || s.length() == 0 || s.charAt(0) == ‘0‘) {
            return 0;
        }
        int[] dp = new int[s.length() + 1];
        //虚拟边界
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i < s.length() + 1; i++) {
            if (s.charAt(i - 1) == ‘0‘) {
                // 0 无法解码
                char pre = s.charAt(i - 2);
                if ((pre == ‘0‘) || ((pre != ‘1‘) && (pre != ‘2‘))) {
                    return 0;
                }
                // 0 解码
                dp[i] = dp[i - 2];
                continue;
            }
            dp[i] = dp[i - 1];
            if (s.charAt(i - 2) != ‘0‘ && Integer.valueOf(s.substring(i - 2, i)) < 27) {
                if (i - 2 >= 0) {
                    dp[i] += dp[i - 2];
                }
            }
        }
        return dp[s.length()];
    }

  状态转移过程中,dp[i] 只与 dp[i-1] 和 dp[i-2] 有关。因此不必建立缓存数组,只缓存前两个结果即可。优化下空间复杂度:

public final int numDecodings0(String s) {
        if (s == null || s.length() == 0 || s.charAt(0) == ‘0‘) {
            return 0;
        }
        //虚拟边界
        int pre1 = 1;
        int pre2 = 1;
        for (int i = 2; i < s.length() + 1; i++) {
            int current = 0;
            char preChar = s.charAt(i - 2);
            if (s.charAt(i - 1) == ‘0‘) {
                // 0 无法解码
                if ((preChar == ‘0‘) || ((preChar != ‘1‘) && (preChar != ‘2‘))) {
                    return 0;
                }
                // 0 解码
                current = pre2;
                pre1 = current;
                continue;
            }
            current = pre1;
            if (preChar != ‘0‘ && Integer.valueOf(s.substring(i - 2, i)) < 27) {
                current += pre2;
            }
            pre2 = pre1;
            pre1 = current;
        }
        return pre1;
    }

 

Leetcode 91 解码方法

标签:height   turn   current   空间   字符串   怎么   http   pre   字符   

原文地址:https://www.cnblogs.com/niuyourou/p/13303062.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!