ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode-091-解码方法

2021-10-15 08:01:18  阅读:118  来源: 互联网

标签:right return 映射 091 解码 result numDecodings LeetCode left


解码方法

题目描述:一条包含字母 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/problems/decode-ways/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:递归 穷举
  • 首先,当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"));
    }
}

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

标签:right,return,映射,091,解码,result,numDecodings,LeetCode,left
来源: https://www.cnblogs.com/kaesar/p/15409388.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有