题目描述:
一条包含字母 A-Z 的消息通过以下方式进行了编码:
‘A’ -> 1
‘B’ -> 2
…
‘Z’ -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12" 输出: 2 解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入: "226" 输出: 3 解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
思路:
这道题目可以使用动态规划的思路来完成,通过定义一个整数数组dp,用dp[i]来表示从字符串 s 的起始位置到 下标i的解码总数,则对字符串 s 的下标i位置的元素的判断有如下两种方式:
1、字符串 s 在下标 i 的元素为 ‘0’,测试还需要判断前一个元素是否也为 ‘0’ 或者 大于 ‘2’,即两个元素组合成的数字是否在10 ~ 26 之间;
2、字符串 s 在下标 i 的元素不为 ‘0’,此时也需要判断该元素和上一元素组合成的数字是否在10 ~ 26 之间;
Java 代码:
public int numDecodings(String s) { if(null == s || s.length() == 0 || s.charAt(0) == '0'){ return 0; } int [] result = new int[s.length() + 1]; result[0] = 1; for(int i = 1; i <= s.length(); i ++){ if(s.charAt(i-1) == '0'){ if(i > 1 && (s.charAt(i - 2) == '0' || Integer.valueOf(s.substring(i-2,i)) > 26)){ return 0; } result[i] = result[i - 2]; }else{ if( i > 1){ if(s.charAt(i - 2) == '0'){ result[i] = result[i - 2]; }else{ result[i] = Integer.valueOf(s.substring(i-2,i)) <= 26 ? result[i - 2] + result[i - 1] : result[i - 1]; } }else{ result[i] = result[i - 1]; } } } return result[s.length()]; }