题目:
一条包含字母 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) 。
思路:
1、划分型动态规划
2、把一个串划分成若干段
初始条件:
设字符串前i个字符有 f [ i ] 种解密方式,所以f[0] = 0,即空串可以解密成空串一种方式。
好处是通过多出一个f[0]可以在算f1和f2的时候更方便,否则手动确定f1、f2可能会有很多种情况
边界情况:f[1] = 1
代码:
class Solution {
public int numDecodings(String s) {
char[] c = s.toCharArray();
int n = c.length;
if (n == 0) return 0;
int[] f = new int[n + 1];
f[0] = 1;
for (int i = 1; i <= n; i++) {
f[i] = 0;
//第一位数
int t = c[i - 1] - '0';
if (t >= 1 && t <= 9)
f[i] += f[i - 1];
//长度必须大于1时才进行判断
if (i >= 2) {
//最后2位数
t = (c[i - 2] - '0') * 10 + (c[i - 1] - '0');
if (t >= 10 && t <= 26)
f[i] += f[i - 2];
}
}
return f[n];
}
}