题目:
一条包含字母 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) 。
思路:参考了网上大神的代码,原文链接如下: https://blog.csdn.net/u012156116/article/details/79763005。
这个题是给出一组数字,判断共有多少种解码方案。整体上可以看做是动态规划。有些类似于上台阶有多少种解决方案。但这个题中有0和26的限制。以下代码的思路上先处理前两个字符。第一个字符如果是0的话解码方法就是0,;接着判断第二个字符,这部分只需判断第二个和第一个字符是否小于26.对于之后的各个字符,都有两种形式的解码方案,一是自己本身可以解码,另外是和前一个字符组合。如果字符本身为0,需要判断和前一个字符组合是否小于26,若满足,则dp[i]=dp[1[+dp[i-2];若不是0,除了与前一个字符组合外,还可以自己编码,即dp[i]=dp[i]+dp[i-1].
代码:
class Solution {
public static int numDecodings(String s) {
if(s.length()==0){
return 0;
}
int[] dp = new int[s.length()];
dp[0] = s.charAt(0)=='0'?0:1;
if(s.length()==1){
return dp[0];
}
int k = s.charAt(0) > '0' && s.charAt(1) > '0'? 1:0;
dp[1] = k + (s.charAt(0) == '1' || s.charAt(0) == '2' && s.charAt(1) <= '6' ? 1:0);
for (int i = 2; i < dp.length; i++) {
if(s.charAt(i)!='0'){
dp[i] += dp[i-1];
}
if(s.charAt(i-1)=='1'||s.charAt(i-1)=='2'&&s.charAt(i)<='6'){
dp[i] += dp[i-2];
}
}
return dp[s.length()-1];
}
}