乐趣区

关于java:LeetCode091解码方法

解码办法

题目形容:一条蕴含字母 A-Z 的音讯通过以下映射进行了 编码:

‘A’ -> 1
‘B’ -> 2

‘Z’ -> 26
要 解码 已编码的音讯,所有数字必须基于上述映射的办法,反向映射回字母(可能有多种办法)。例如,”11106″ 能够映射为:

“AAJF”,将音讯分组为 (1 1 10 6)
“KJF”,将音讯分组为 (11 10 6)
留神,音讯不能分组为 (1 11 06),因为 “06” 不能映射为 “F”,这是因为 “6” 和 “06” 在映射中并不等价。

给你一个只含数字的 非空 字符串 s,请计算并返回 解码 办法的 总数。

题目数据保障答案必定是一个 32 位 的整数。

示例阐明请见 LeetCode 官网。

起源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl…
著作权归领扣网络所有。商业转载请分割官网受权,非商业转载请注明出处。

解法一:递归 穷举
  • 首先,当 snull或者是空字符串或者 s 是以 0 结尾的字符串,不可能映射胜利,间接返回0
  • 如果 s 的长度为 1,间接返回 1。
  • 而后是递归解决当 s 的长度大于 1 的状况,递归办法解决逻辑如下(办法的入参 leftright别离为以后要匹配的字符的开始和完结地位0 < (right - left) < 3):

    • 如果 left 地位的数字为 0 即要匹配的字符是以 0 结尾,则无奈映射,间接返回;
    • 如果 leftright所匹配的字符数大于 26,无奈映射,返回;
    • 如果 rights的最初一位,则 result 加 1,返回;
    • 如果 rights的倒数第二位,且最初一位不是 0,则 result 加 1,返回;
    • 前面则依据 right 后的位数持续递归解决 right ~ right + 1right ~ right + 2的状况。
  • 最初返回 result 即为解码办法的总数。
public class LeetCode_091 {

    private static int result = 0;

    /**
     * 递归 穷举:性能较差,提交会超时
     *
     * @param s
     * @return
     */
    public static int numDecodings(String s) {
        // 这些状况无奈映射,间接返回 0
        if (s == null || s == ""|| s.equals("0") || s.startsWith("0")) {return 0;}

        if (s.length() == 1) {return 1;}

        numDecodings(s, 0, 1);
        numDecodings(s, 0, 2);
        return result;
    }



    public static void numDecodings(String s, int left, int right) {if (s.charAt(left) == '0') {return;}
        if (Integer.valueOf(s.substring(left, right)) > 26) {return;}
        if (s.length() - right == 0) {
            result++;
            return;
        }
        if (s.length() - right == 1 && s.charAt(s.length() - 1) != '0') {
            result++;
            return;
        }
        numDecodings(s, right, right + 1);
        if (s.length() - right > 1) {numDecodings(s, right, right + 2);
        }
    }

    public static void main(String[] args) {System.out.println(numDecodings("226"));
    }
}

【每日寄语】与天奋斗,其乐无穷!与地奋斗,其乐无穷!与人奋斗,其乐无穷!

退出移动版