解码办法
题目形容:一条蕴含字母 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...
著作权归领扣网络所有。商业转载请分割官网受权,非商业转载请注明出处。
解法一:递归 穷举
- 首先,当s为null或者是空字符串或者s是以0结尾的字符串,不可能映射胜利,间接返回0。
- 如果s的长度为1,间接返回1。
而后是递归解决当s的长度大于1的状况,递归办法解决逻辑如下(办法的入参left和right别离为以后要匹配的字符的开始和完结地位
0 < (right - left) < 3
):
- 如果left地位的数字为0即要匹配的字符是以0结尾,则无奈映射,间接返回;
- 如果left和right所匹配的字符数大于26,无奈映射,返回;
- 如果right为s的最初一位,则result加1,返回;
- 如果right为s的倒数第二位,且最初一位不是0,则result加1,返回;
- 前面则依据right后的位数持续递归解决
right ~ right + 1
和right ~ 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")); }}
【每日寄语】 与天奋斗,其乐无穷!与地奋斗,其乐无穷!与人奋斗,其乐无穷!