核心: 特征分离 转化为 斐波那契数组 用动态规划
思路:
动态规划:用dp[i]数组记录i位置对应的数量,假设我们知道dp[i-1],到了第i个时,我们把问题拆成两次讨论:
1.不考虑与前面的组合:
如果i大于0,那么此时至少满足dp[i] = dp[i-1],先赋值;等于0就不用说了;
2.在上面的基础上考虑组合:
首先要计算这个组合是不是在0到26内,如果是的话,那么是不是可以把两个数的组合看成一个数,注意此处
已经排除了单个的情况。那么就等于是在i-2的基础上考虑i-1的情况,此处是关键,细细品味。所以结论就是:
dp[i] = dp[i-1]+dp[i-2]。如果不在0到26呢,是不是与1中的i=0的情况一样可以pass了
public int numDecodings(String s) {
int n = s.length();
int dp[] = new int[n + 1];
dp[0] = 1;
for (int i = 1; i <= n; i++) {
if (s.charAt(i - 1) != '0') dp[i] = dp[i - 1];
if (i >= 2) {
int temp = (s.charAt(i - 2) - '0') * 10 + (s.charAt(i - 1) - '0');
if (temp >= 10 && temp <= 26) dp[i] += dp[i - 2];
}
}
return dp[n];
}